OpenGL Alpha混合错误的颜色

时间:2009-07-22 18:06:37

标签: c++ qt opengl

我正在尝试创建一个简单的光线跟踪器。我有一个透视图,可以显示光线,以便进行调试。

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

光线绘制为

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);

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

以下是截图:

screenshot

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

谢谢!

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:2)

  1. 您不需要glAlphaFunc,请将其停用。
  2. 光线应该通过添加到缓冲区来混合:glBlendFunc(GL_ONE, GL_ONE)(对于预选的alpha,您选择的。
  3. 渲染光线时关闭深度缓冲区写入(不测试):glDepthMask(GL_FALSE)
  4. 最后渲染光线。

答案 2 :(得分:0)

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