Phong-Alpha material 透明度
Phong-Alpha material transparency
我正在使用 pre-built material 的 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
,因此我希望 material 为 semi-transparent。但除了部分地区外,该模型看起来大部分是白色的:
当我检查 source code 时,我看到 alpha-blending 的设置:
m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
m_blendState->setDestinationRgb(QBlendEquationArguments::OneMinusSourceAlpha);
m_blendEquation->setBlendFunction(QBlendEquation::Add);
不知为什么模特看起来是白色的?
根据@Macke 的建议,黑色背景上的 object 看起来不错!
当我将 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
渲染结果很好:
更新
在@EddyAlleman的建议下,我添加了这样几行代码:
blendState->setSourceAlpha(Qt3DRender::QBlendEquationArguments::Zero);
blendState->setDestinationAlpha(Qt3DRender::QBlendEquationArguments::One);
然后,透明度(alpha = 0.4
)即使在灰色背景下也很好:
尽量不要使用混合方程,好像混合状态计算的颜色被添加到灰色背景中。 (可能对 got 粒子火花有好处,对物体不太好)
黑色背景看起来如何?
试试这个来设置混合方程状态
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
我正在使用 pre-built material 的 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
,因此我希望 material 为 semi-transparent。但除了部分地区外,该模型看起来大部分是白色的:
当我检查 source code 时,我看到 alpha-blending 的设置:
m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
m_blendState->setDestinationRgb(QBlendEquationArguments::OneMinusSourceAlpha);
m_blendEquation->setBlendFunction(QBlendEquation::Add);
不知为什么模特看起来是白色的?
根据@Macke 的建议,黑色背景上的 object 看起来不错!
当我将 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
渲染结果很好:
更新
在@EddyAlleman的建议下,我添加了这样几行代码:
blendState->setSourceAlpha(Qt3DRender::QBlendEquationArguments::Zero);
blendState->setDestinationAlpha(Qt3DRender::QBlendEquationArguments::One);
然后,透明度(alpha = 0.4
)即使在灰色背景下也很好:
尽量不要使用混合方程,好像混合状态计算的颜色被添加到灰色背景中。 (可能对 got 粒子火花有好处,对物体不太好)
黑色背景看起来如何?
试试这个来设置混合方程状态
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