我正在使用Qt3D编写应用程序。我一直在做的大多数3D处理都使用QML而不是C ++接口。我已经创建了一个QML效果,可以加载我的着色器程序,类似于Qt5.9附带的PerVertex颜色效果QML。
我遇到的问题是我正在尝试编写片段着色器并使用<Route path="/foo" render={(props) =>
<div>
<SplitView>
<ContainerA {...props} />
</SplitView>
<Header />
<SplitView>
<ContainerC {...props} />
</SplitView>
</div>
}}
/>
。根据OpenGL文档,我需要设置glBlendFunc(sfactor, dfactor)
并使用glEnable(GL_BLEND)
,但我不知道如何使用QML。我可以看到它是如何在C ++方面完成的,但是当我使用QML Scene3D时,需要进行大量的重写才能完成。谁能告诉我如何通过Qt3D QML启用OpenGL功能(如glBlendFunc
)?
根据要求,片段着色器:
GL_BLEND
这也是效果组件:
#version 330 core
// TODO: Replace with a struct
uniform vec3 ka; // Ambient reflectivity
uniform vec3 kd; // Diffuse reflectivity
uniform vec3 ks; // Specular reflectivity
uniform float shininess; // Specular shininess factor
uniform float alpha;
uniform vec3 eyePosition;
in vec3 worldPosition;
in vec3 worldNormal;
in vec3 color;
out vec4 fragColor;
#pragma include light.inc.frag
void main()
{
vec3 diffuseColor, specularColor;
adsModel(worldPosition, worldNormal, eyePosition, shininess, diffuseColor, specularColor);
fragColor = vec4( ka * color + kd * color * diffuseColor + ks * color * specularColor, 1.0 );
}
答案 0 :(得分:2)
在Qt3D中无法直接调用glBlendFunc
。您需要设置RenderPass的renderStates
属性。它应该与此类似,具体取决于您要启用的混合功能和其他状态:
renderPasses: [
RenderPass {
filterKeys: [ FilterKey { name: "pass"; value: "forward" } ]
renderStates: [
CullFace { mode : CullFace.Back },
DepthTest { depthFunction: DepthTest.Less },
NoDepthMask { },
BlendEquationArguments {
sourceRgb: BlendEquationArguments.SourceAlpha
destinationRgb: BlendEquationArguments.OneMinusSourceAlpha
},
BlendEquation {blendFunction: BlendEquation.Add}
]
shaderProgram: ShaderProgram {
vertexShaderCode: loadSource("qrc:/shaders/thermal.vert")
fragmentShaderCode: loadSource("qrc:/shaders/thermal.frag")
}
}
]