OpenGL Alpha混合错误的颜色

Posted

技术标签:

【中文标题】OpenGL Alpha混合错误的颜色【英文标题】:OpenGL Alpha blending with wrong color 【发布时间】:2009-07-22 18:06:36 【问题描述】:

我正在尝试创建一个简单的光线追踪器。我有一个透视图,可以直观地显示光线以用于调试目的。

在下面的示例屏幕截图中,我有一个要进行光线追踪的白色球体和一个代表眼睛的绿色球体。

光线用

绘制成线
glLineWidth(10.0f)

如果光线错过球体,它会被赋予颜色

glColor4ub(100,100,100,100);

在我的初始化代码中,我有以下内容:

glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_SRC_ALPHA);

您可以在屏幕截图中看到,由于某种原因,在透视点和球体之间传递的光线正在与球体后面的轴线混合,而不是与球体本身混合。

这是截图:

谁能解释我在这里做错了什么?

谢谢!!

【问题讨论】:

我编辑了你的截图 【参考方案1】:

是否有可能在绘制球体之前投射这些光线?

然后,如果启用 Z 缓冲区,球体的片段将不会被渲染,因为这些部分的光线更接近。当你绘制半透明的东西时(使用混合),你应该仔细观察你绘制的东西的顺序。

事实上,我认为你不能以任何合理的方式将 Z-buffer 与光线追踪过程一起使用。您必须手动跟踪 Z 顺序。虽然我们在这里,但 OpenGL 可能不是可视化光线追踪过程的最佳 API。 (它可能会比纯软件光线追踪器慢得多)

【讨论】:

好吧,我会……只需更改我的绘图代码的顺序即可;我不知道这会对事情产生如此大的影响!谢谢你,先生!你是一个绅士和一个学者。 只是为了澄清我对好奇者的意图。实际的光线追踪完全独立于 OpenGL 绘图。我刚刚抛出了一个 3d 透视图,以帮助我在光线追踪器工作时进行调试。它只显示光线和光线跟踪图像的副本,纹理到光线跟踪器眼点前面的四边形上。 @puddlesofjoy:您是否有机会编辑问题并在此修复后添加结果?人们可能会看到您的预期结果是什么样的。没什么大不了的——只是一个建议。很高兴这成功了!【参考方案2】:
    你不需要glAlphaFunc,禁用它。 应通过将光线添加到缓冲区来混合光线:glBlendFunc(GL_ONE, GL_ONE)(用于预乘 alpha,由您选择。 在渲染光线时关闭深度缓冲区写入(不测试):glDepthMask(GL_FALSE) 最后渲染光线。

【讨论】:

【参考方案3】:

AlphaTest 仅用于丢弃片段 - 不用于混合它们。检查the spec 通过使用它,您告诉 OpenGL 您希望它丢弃像素而不是绘制它们,因此您将无法进行任何透明混合。最常见的混合功能是 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);您也可以查看OpenGL Transparency FAQ。

【讨论】:

以上是关于OpenGL Alpha混合错误的颜色的主要内容,如果未能解决你的问题,请参考以下文章

渲染管道像素阶段“Alpha混合”

渲染管道像素阶段“Alpha混合”

在小 alpha 值上错误地在 OpenGL 中混合

Alpha 混合和 UIView 背景颜色

在 QGLFramebufferObject 上渲染时错误的 alpha 混合

OpenGL alpha 混合突然停止