Phong-Alpha 材质透明度

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,我观察到:

阿尔法 = 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渲染结果很好:

启用深度蒙版,alpha = 1.0


更新

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

blendState->setSourceAlpha(Qt3DRender::QBlendEquationArguments::Zero);
blendState->setDestinationAlpha(Qt3DRender::QBlendEquationArguments::One);
Run Code Online (Sandbox Code Playgroud)

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

阿尔法 = 0.4

Edd*_*man 2

尝试设置混合方程状态

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