c++ - Phong-Alpha Material 透明度

标签 c++ qt opengl glsl qt3d

我正在使用 Qt3D 的预构建 Material :

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 是半透明的。但是除了一些区域,模型看起来大部分是白色的:

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 , 深度 mask 默认是禁用的:

// ...
, 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

最佳答案

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

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

来自枚举 QBlendEquationArguments::Blending 的信息

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

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

关于c++ - Phong-Alpha Material 透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57489897/

相关文章:

c++ - 如何将自定义对象插入到 std::map 中?

c++ - 如何在C++中使用模板对象的模板成员函数创建线程

qt - Qt 4.6 中的 FTPS (FTP-SSL)

c++ - Qt 5.7.1/GCC 6.3.0:错误:constexpr函数的主体'静态constexpr int QMetaTypeId2 <T>

c++ - Qt Windows 获取鼠标光标图标

c++ - OpenGL 显示列表是否烘焙 glVertex 数据?

c++ - 如何在 openGL 中旋转图像?

c++ - 停止计算运算符<<

c++ - 在 win32/Opengl 中捕获鼠标移动

ios - 如何通过颜色混合着色器将 RGBA 转换为 BGRA