透明天空盒+透明高度图的OpenGL混合问题

Posted

技术标签:

【中文标题】透明天空盒+透明高度图的OpenGL混合问题【英文标题】:OpenGL Blending problem with transparent skybox + transparent heightmap 【发布时间】:2011-02-26 19:54:26 【问题描述】:

这是我的问题。

在我渲染一个带有 6 个透明多边形(GL_BLEND、源 GL_ONE、目标 GL_ONE)的立方体天空盒之后,我正在渲染所有内容之前的正交四边形(填充视口)(每个角落都有顶点着色)。效果很好,天空盒被下面的四边形着色一半,被它自己的 UV 贴图纹理着色一半。

当我添加高度图(GL_BLEND,GL_ONE,...)时,问题就出现了。高度图与 + 下的天空盒与四边形混合。

我想要的是与正交四边形混合但不与天空盒混合的高度图。我不想通过高度图看到天空盒。

我确信还有另一种方法可以做到这一点。

是否可以先渲染正交四边形和天空盒(就像现在一样)然后使用特殊混合来渲染高度图,该混合减去天空盒而不是正交四边形与某种多通道混合?

非常感谢!

迪米特里

【问题讨论】:

【参考方案1】:

您的glBlendFuncGL_ONE, GL_ONE 称为加法混合,并且具有可交换的良好属性(与任何加法一样),即 A+B = B+A。

然后你可以按其他顺序绘制你的东西,你的混合会得到相同的结果。

在你的情况下,你可以绘制你的高度图和你的天空盒,没有混合; 然后你的全屏四边形混合。

为了防止高度图和天空盒重叠,您可以:

先绘制天空盒,然后绘制高度图 反过来画,启用 GL_DEPTH_TEST 让 Z 缓冲区为您排序像素可见性

希望对你有帮助

【讨论】:

【参考方案2】:

OpenGL 不是场景图,因此在每个渲染步骤之后,所有现有内容的所有进一步命令。 glBlendFunc(GL_ONE, GL_ONE);无论如何听起来都不对,除非您真的想添加这些值。我认为您正在寻找 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

【讨论】:

你知道我该怎么做吗?是否有一些算法可以将天空盒多边形的隐藏部分剪裁成更小的我可以阻止渲染的部分?我可能不是第一个遇到多个透明事物与其他事物发生冲突的情况。 为了使混合正常工作,您必须将部件从后到前排序。接下来你肯定不想使用 GL_ONE、GL_ONE 混合功能,因为这会导致事物“发光”。我很确定你想要一些 alpha 通道控制的混合(到目前为止你还没有使用 alpha 通道)。

以上是关于透明天空盒+透明高度图的OpenGL混合问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 在延迟渲染器中实现天空盒

OpenGL:渲染天空盒立方体贴图问题

✠OpenGL-9-天空和背景

OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)

GLSL 纹理函数只为天空盒返回黑色

Unity 自定义天空盒,如 Unity 天空盒