首页 > 解决方案 > Phong-Alpha 材质透明度

问题描述

我正在使用 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,所以我希望材料是半透明的。但该模型看起来大部分是白色的,除了一些区域:

结果

当我检查源代码时,我看到了 alpha 混合的以下设置:

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

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


正如@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);

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

启用深度蒙版,alpha = 1.0


更新

由@EddyAlleman 建议,我添加了这样的代码行:

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

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

阿尔法 = 0.4

标签: c++qtopenglglslqt3d

解决方案


试试这个来设置混合方程状态

set sourceAlphaArg to Qt3DRender::QBlendEquationArguments::Zero
set destinationAlphaArg to Qt3DRender::QBlendEquationArguments::One

来自枚举 QBlendEquationArguments::Blending 的信息

常量值 OpenGL Qt3DRender::QBlendEquationArguments::Zero 0 GL_ZERO Qt3DRender::QBlendEquationArguments::One 1 GL_ONE

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


推荐阅读