c++ - 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
,我观察到:
更新
正如@Macke 所指出的,一个问题与深度测试有关。在源代码中,深度掩码默认是禁用的:
// ...
, 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
) 也很好:
解决方案
试试这个来设置混合方程状态
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
推荐阅读
- macos - 更新后 Flutter 命令在 Mac OS 的终端中不起作用
- css - flexbox 列中相同高度的列中的一行
- flutter - 如何将值从一个函数传递到另一个函数?
- angular - 类型'可观察的
>' 不可分配给类型 'Observable ' - php - 在 wp_ajax 钩子正常工作后 print_r($_POST,true) 打印 1
- r - 闪亮:几何区域未显示所有组
- flutter - Riverpod,在 BuildContext 和 Provider 之外读取状态
- java - 转换成 Java 8 Lambda 表达式
- nestjs - NestJs TypeOrm 自定义存储库单元测试用例
- json - 在json查询中将多个值传递给相同参数的语法是什么