Skip to content

Commit 5ea4960

Browse files
committed
rhi-backend: Add RHI shaders in addition to the OpenGL versions
Fixes rendering when using Metal on MacOS, which became the default somewhere around Qt 6.6.
1 parent 781b6ce commit 5ea4960

8 files changed

Lines changed: 148 additions & 38 deletions

ChemView.pro

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,11 @@ DISTFILES += \
141141
resources/shaders/gl3/bond_hightlight.frag \
142142
resources/shaders/gl3/bond_hightlight.vert \
143143
resources/shaders/gl3/selection_hightlight.frag \
144-
resources/shaders/gl3/selection_hightlight.vert
144+
resources/shaders/gl3/selection_hightlight.vert \
145+
resources/shaders/rhi/bond_hightlight.frag \
146+
resources/shaders/rhi/bond_hightlight.vert \
147+
resources/shaders/rhi/selection_hightlight.frag \
148+
resources/shaders/rhi/selection_hightlight.vert
145149

146150
unix:!mac {
147151
DESTDIR = bin

mol3dview/bondhighlightentity.cpp

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -67,40 +67,45 @@ BondHighlightMaterial::BondHighlightMaterial(Qt3DCore::QNode *parent) : Qt3DRend
6767
shaderGL3->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/bond_hightlight.vert"))));
6868
shaderGL3->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/bond_hightlight.frag"))));
6969

70-
colorParam = new Qt3DRender::QParameter(QStringLiteral("color"), QColor::fromRgbF(1.0f, 0.0f, 0.0f, 1.0f));
70+
auto shaderRHI = new Qt3DRender::QShaderProgram();
71+
shaderRHI->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/bond_hightlight.vert"))));
72+
shaderRHI->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/bond_hightlight.frag"))));
7173

7274
auto techniqueGL3 = new Qt3DRender::QTechnique();
73-
auto apiFilterGL3 = techniqueGL3->graphicsApiFilter();
74-
apiFilterGL3->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
75-
apiFilterGL3->setMajorVersion(3);
76-
apiFilterGL3->setMinorVersion(1);
77-
apiFilterGL3->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
75+
techniqueGL3->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
76+
techniqueGL3->graphicsApiFilter()->setMajorVersion(3);
77+
techniqueGL3->graphicsApiFilter()->setMinorVersion(1);
78+
techniqueGL3->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
79+
80+
auto techniqueRHI = new Qt3DRender::QTechnique();
81+
techniqueRHI->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::RHI);
82+
techniqueRHI->graphicsApiFilter()->setMajorVersion(1);
83+
techniqueRHI->graphicsApiFilter()->setMinorVersion(0);
7884

79-
auto filterKeyGL3 = new Qt3DRender::QFilterKey(this);
80-
filterKeyGL3->setName(QStringLiteral("renderingStyle"));
81-
filterKeyGL3->setValue(QStringLiteral("forward"));
82-
techniqueGL3->addFilterKey(filterKeyGL3);
85+
// Shared by both render backeneds
86+
colorParam = new Qt3DRender::QParameter(QStringLiteral("color"), QColor::fromRgbF(1.0f, 0.0f, 0.0f, 1.0f));
8387

88+
auto filterKey = new Qt3DRender::QFilterKey(this);
89+
filterKey->setName(QStringLiteral("renderingStyle"));
90+
filterKey->setValue(QStringLiteral("forward"));
91+
92+
// Configure GL render pass
8493
auto renderPassGL3 = new Qt3DRender::QRenderPass();
8594
renderPassGL3->setShaderProgram(shaderGL3);
8695

87-
#if 0
88-
// Enable alpha blending
89-
auto noDepthMask = new Qt3DRender::QNoDepthMask();
90-
renderPassGL3->addRenderState(noDepthMask);
91-
auto blendState = new Qt3DRender::QBlendEquationArguments();
92-
blendState->setSourceRgb(Qt3DRender::QBlendEquationArguments::SourceAlpha);
93-
blendState->setDestinationRgb(Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha);
94-
renderPassGL3->addRenderState(blendState);
95-
auto blendEquation = new Qt3DRender::QBlendEquation();
96-
blendEquation->setBlendFunction(Qt3DRender::QBlendEquation::Add);
97-
renderPassGL3->addRenderState(blendEquation);
98-
#endif
96+
// Configure RHI render pass
97+
auto renderPassRHI = new Qt3DRender::QRenderPass();
98+
renderPassRHI->setShaderProgram(shaderRHI);
9999

100+
techniqueGL3->addFilterKey(filterKey);
100101
techniqueGL3->addRenderPass(renderPassGL3);
101102

103+
techniqueRHI->addFilterKey(filterKey);
104+
techniqueRHI->addRenderPass(renderPassRHI);
105+
102106
auto effect = new Qt3DRender::QEffect(this);
103107
effect->addTechnique(techniqueGL3);
108+
effect->addTechnique(techniqueRHI);
104109
effect->addParameter(colorParam);
105110
setEffect(effect);
106111
}

mol3dview/selectionhighlightentity.cpp

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,58 @@ SelectionHighlightMaterial::SelectionHighlightMaterial(Qt3DCore::QNode *parent)
1818
shaderGL3->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/selection_hightlight.vert"))));
1919
shaderGL3->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/selection_hightlight.frag"))));
2020

21-
colorParam = new Qt3DRender::QParameter(QStringLiteral("color"), QColor::fromRgbF(1.0f, 0.0f, 0.0f, 1.0f));
21+
auto shaderRHI = new Qt3DRender::QShaderProgram();
22+
shaderRHI->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/selection_hightlight.vert"))));
23+
shaderRHI->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/selection_hightlight.frag"))));
2224

2325
auto techniqueGL3 = new Qt3DRender::QTechnique();
24-
auto apiFilterGL3 = techniqueGL3->graphicsApiFilter();
25-
apiFilterGL3->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
26-
apiFilterGL3->setMajorVersion(3);
27-
apiFilterGL3->setMinorVersion(1);
28-
apiFilterGL3->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
26+
techniqueGL3->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
27+
techniqueGL3->graphicsApiFilter()->setMajorVersion(3);
28+
techniqueGL3->graphicsApiFilter()->setMinorVersion(1);
29+
techniqueGL3->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
2930

30-
auto filterKeyGL3 = new Qt3DRender::QFilterKey(this);
31-
filterKeyGL3->setName(QStringLiteral("renderingStyle"));
32-
filterKeyGL3->setValue(QStringLiteral("forward"));
33-
techniqueGL3->addFilterKey(filterKeyGL3);
31+
auto techniqueRHI = new Qt3DRender::QTechnique();
32+
techniqueRHI->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::RHI);
33+
techniqueRHI->graphicsApiFilter()->setMajorVersion(1);
34+
techniqueRHI->graphicsApiFilter()->setMinorVersion(0);
3435

35-
auto renderPassGL3 = new Qt3DRender::QRenderPass();
36-
renderPassGL3->setShaderProgram(shaderGL3);
36+
// Shared by both render backeneds
37+
colorParam = new Qt3DRender::QParameter(QStringLiteral("color"), QColor::fromRgbF(1.0f, 0.0f, 0.0f, 1.0f));
38+
39+
auto filterKey = new Qt3DRender::QFilterKey(this);
40+
filterKey->setName(QStringLiteral("renderingStyle"));
41+
filterKey->setValue(QStringLiteral("forward"));
3742

38-
// Enable alpha blending
3943
auto noDepthMask = new Qt3DRender::QNoDepthMask();
40-
renderPassGL3->addRenderState(noDepthMask);
4144
auto blendState = new Qt3DRender::QBlendEquationArguments();
4245
blendState->setSourceRgb(Qt3DRender::QBlendEquationArguments::SourceAlpha);
4346
blendState->setDestinationRgb(Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha);
44-
renderPassGL3->addRenderState(blendState);
4547
auto blendEquation = new Qt3DRender::QBlendEquation();
4648
blendEquation->setBlendFunction(Qt3DRender::QBlendEquation::Add);
49+
50+
// Configure GL render pass
51+
auto renderPassGL3 = new Qt3DRender::QRenderPass();
52+
renderPassGL3->setShaderProgram(shaderGL3);
53+
renderPassGL3->addRenderState(noDepthMask);
54+
renderPassGL3->addRenderState(blendState);
4755
renderPassGL3->addRenderState(blendEquation);
4856

57+
// Configure RHI render pass
58+
auto renderPassRHI = new Qt3DRender::QRenderPass();
59+
renderPassRHI->setShaderProgram(shaderRHI);
60+
renderPassRHI->addRenderState(noDepthMask);
61+
renderPassRHI->addRenderState(blendState);
62+
renderPassRHI->addRenderState(blendEquation);
63+
64+
techniqueGL3->addFilterKey(filterKey);
4965
techniqueGL3->addRenderPass(renderPassGL3);
5066

67+
techniqueRHI->addFilterKey(filterKey);
68+
techniqueRHI->addRenderPass(renderPassRHI);
69+
5170
auto effect = new Qt3DRender::QEffect(this);
5271
effect->addTechnique(techniqueGL3);
72+
effect->addTechnique(techniqueRHI);
5373
effect->addParameter(colorParam);
5474
setEffect(effect);
5575
}

resources/Resources.qrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,9 @@
3838
<file>shaders/gl3/selection_hightlight.frag</file>
3939
<file>shaders/gl3/bond_hightlight.frag</file>
4040
<file>shaders/gl3/bond_hightlight.vert</file>
41+
<file>shaders/rhi/selection_hightlight.vert</file>
42+
<file>shaders/rhi/selection_hightlight.frag</file>
43+
<file>shaders/rhi/bond_hightlight.frag</file>
44+
<file>shaders/rhi/bond_hightlight.vert</file>
4145
</qresource>
4246
</RCC>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#version 450
2+
3+
//layout(location = 0) in vec2 texCoord;
4+
5+
layout(location = 0) out vec4 fragColor;
6+
7+
layout(std140, binding = 2) uniform qt3d_custom_uniforms {
8+
vec4 color;
9+
};
10+
11+
void main()
12+
{
13+
fragColor = color;
14+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#version 450
2+
3+
layout(location = 0) in vec3 vertexPosition;
4+
5+
layout(std140, binding = 1) uniform qt3d_command_uniforms {
6+
mat4 modelMatrix;
7+
mat4 inverseModelMatrix;
8+
mat4 modelViewMatrix;
9+
mat3 modelNormalMatrix;
10+
mat4 inverseModelViewMatrix;
11+
mat4 mvp;
12+
mat4 inverseModelViewProjectionMatrix;
13+
};
14+
15+
void main()
16+
{
17+
gl_Position = mvp * vec4( vertexPosition, 1.0 );
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#version 450
2+
3+
layout(location = 0) in vec2 texCoord;
4+
5+
layout(location = 0) out vec4 fragColor;
6+
7+
layout(std140, binding = 2) uniform qt3d_custom_uniforms {
8+
vec4 color;
9+
};
10+
11+
// Circle drawing code from: https://rubendv.be/posts/fwidth/
12+
13+
void main()
14+
{
15+
//fragColor = vec4(0.961, 0.737, 0.259, 1.0);
16+
//vec4 hard_color = vec4(0.961, 0.737, 0.259, 1.0);
17+
float dist = distance(texCoord, vec2(0.50, 0.50));
18+
float delta = fwidth(dist);
19+
float alpha = 1.0 - smoothstep(0.5-delta, 0.5, dist);
20+
// fragColor = vec4(color.rgb, color.a * alpha);
21+
fragColor = vec4(color.rgb, color.a * alpha);
22+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#version 450
2+
3+
layout(location = 0) in vec3 vertexPosition;
4+
layout(location = 1) in vec2 vertexTexCoord;
5+
6+
layout(location = 0) out vec2 texCoord;
7+
8+
layout(std140, binding = 1) uniform qt3d_command_uniforms {
9+
mat4 modelMatrix;
10+
mat4 inverseModelMatrix;
11+
mat4 modelViewMatrix;
12+
mat3 modelNormalMatrix;
13+
mat4 inverseModelViewMatrix;
14+
mat4 mvp;
15+
mat4 inverseModelViewProjectionMatrix;
16+
};
17+
18+
void main()
19+
{
20+
texCoord = vertexTexCoord;
21+
22+
gl_Position = mvp * vec4( vertexPosition, 1.0 );
23+
}

0 commit comments

Comments
 (0)