use*_*291 5 c++ opengl qt glsl qt3d
我正在使用 Qt3D 的预制材料:
Qt3DRender::QMaterial *MyClass::createMaterial()
{
Qt3DExtras::QPhongAlphaMaterial *mat = new Qt3DExtras::QPhongAlphaMaterial();
mat->setAmbient(QColor("#576675"));
mat->setDiffuse(QColor("#5F6E7D"));
mat->setSpecular(QColor("#61707F"));
mat->setShininess(0.0f);
mat->setAlpha(0.5f);
return mat;
}
Run Code Online (Sandbox Code Playgroud)
我将 alpha 设置为0.5f,所以我希望材料是半透明的。但模型看起来大部分是白色的,除了一些区域:
当我检查源代码时,我看到了 alpha 混合的这个设置:
m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
m_blendState->setDestinationRgb(QBlendEquationArguments::OneMinusSourceAlpha);
m_blendEquation->setBlendFunction(QBlendEquation::Add);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么模型看起来是白色的?
正如@Macke 所建议的,黑色背景上的物体看起来不错!
当我设置alpha为 时1.0,我观察到:
正如@Macke 所指出的,一个问题与深度测试有关。在源代码上,默认情况下禁用深度蒙版:
// ...
, m_noDepthMask(new QNoDepthMask())
// ...
m_phongAlphaGL3RenderPass->addRenderState(m_noDepthMask);
m_phongAlphaGL2RenderPass->addRenderState(m_noDepthMask);
m_phongAlphaES2RenderPass->addRenderState(m_noDepthMask);
Run Code Online (Sandbox Code Playgroud)
我通过删除QNoDepthMask东西启用了深度蒙版,现在alpha = 1.0渲染结果很好:
在@EddyAlleman 的建议下,我添加了以下代码行:
blendState->setSourceAlpha(Qt3DRender::QBlendEquationArguments::Zero);
blendState->setDestinationAlpha(Qt3DRender::QBlendEquationArguments::One);
Run Code Online (Sandbox Code Playgroud)
然后,alpha = 0.4即使在灰色背景下,透明度 ( ) 也很好:
尝试设置混合方程状态
set sourceAlphaArg to Qt3DRender::QBlendEquationArguments::Zero
set destinationAlphaArg to Qt3DRender::QBlendEquationArguments::One
Run Code Online (Sandbox Code Playgroud)
来自枚举 QBlendEquationArguments::Blending 的信息
常量值 OpenGL Qt3DRender::QBlendEquationArguments::Zero 0 GL_ZERO Qt3DRender::QBlendEquationArguments::One 1 GL_ONE
编辑:可以在这里找到一个很好的解释:learnopengl.com/Advanced-OpenGL/Blending