Phong-Alpha材料透明度

时间:2019-08-14 07:20:13

标签: c++ qt opengl 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;
}

我将alpha设置为0.5f,所以我希望材料是半透明的。但是该模型看起来除部分区域外大多是白色的:

Result

当我检查source code时,我看到以下设置为alpha混合:

m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
m_blendState->setDestinationRgb(QBlendEquationArguments::OneMinusSourceAlpha);
m_blendEquation->setBlendFunction(QBlendEquation::Add);

我想知道为什么模型看起来是白色的吗?


如@Macke所建议,黑色背景上的对象看起来不错!

black background

当我将alpha设置为1.0时,会发现:

alpha = 1.0


更新

正如@Macke指出的,一个问题与深度测试有关。在source code上,默认情况下禁用深度蒙版:

// ...
, m_noDepthMask(new QNoDepthMask())
// ...

m_phongAlphaGL3RenderPass->addRenderState(m_noDepthMask);

m_phongAlphaGL2RenderPass->addRenderState(m_noDepthMask);

m_phongAlphaES2RenderPass->addRenderState(m_noDepthMask);

我通过删除QNoDepthMask的东西启用了深度蒙版,现在使用alpha = 1.0渲染效果很好:

enable depth mask, alpha = 1.0


更新

由@EddyAlleman建议,我添加了以下代码行:

blendState->setSourceAlpha(Qt3DRender::QBlendEquationArguments::Zero);
blendState->setDestinationAlpha(Qt3DRender::QBlendEquationArguments::One);

然后,即使在灰色背景下,透明度(alpha = 0.4)也可以:

alpha = 0.4

2 个答案:

答案 0 :(得分:2)

尝试设置混合方程式状态

set sourceAlphaArg to Qt3DRender::QBlendEquationArguments::Zero
set destinationAlphaArg to Qt3DRender::QBlendEquationArguments::One
枚举QBlendEquationArguments :: Blending中的

info

恒定值OpenGL Qt3DRender :: QBlendEquationArguments ::零0 GL_ZERO Qt3DRender :: QBlendEquationArguments :: One 1 GL_ONE

编辑: 可以在这里找到一个很好的解释:learningopengl.com/Advanced-OpenGL/Blending

答案 1 :(得分:1)

尝试不使用blendequation,似乎由blendstate计算的颜色已添加到灰色背景。 (可能对产生粒子火花有好处,对物体则少)

黑色背景看起来如何?