2011-02-26 184 views
0

这是我的问题。透明天空盒+透明高度图的OpenGL混合问题

我在渲染带有6个透明多边形(GL_BLEND,源GL_ONE,目标GL_ONE)的立方体天空盒之后,在所有事物(每个角都有顶点着色)之前渲染正交四边形(填充视口)。这很好地工作,天空盒是由下面的四边形半色调和由它自己的UV贴图纹理半色调。

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

我想要的是与ortho quad混合的高度图,但不能与skybox混合使用。我不想通过高度图看到天空盒。

我相信还有另一种方法来做到这一点。

是否有可能首先渲染ortho quad和skybox(就像现在这样)然后使用特殊融合的高度贴图减去skybox,而不是使用某种multipass融合的ortho quad?

非常感谢!

迪米特里

回答

0

OpenGL是没有一个场景图,所以每个渲染步骤后​​,所有的现有内容的所有进一步的命令。 glBlendFunc(GL_ONE,GL_ONE);听起来不正确,除非你真的想添加值。我想你正在寻找glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

+0

你有什么想法,我怎么能做到这一点?是否有一些算法可以将天空盒多边形的隐藏部分剪辑为较小的部分,以防止渲染?我可能不是第一个遇到多个透明事物与其他人发生冲突的案例。 – dimcaron144 2011-02-26 21:31:30

+0

要使混合正常工作,必须将零件重新排列。接下来你肯定不想使用GL_ONE,GL_ONE混合函数,因为这会让事情“发光”。我很肯定你想要一些alpha通道控制的混合(到目前为止你没有使用alpha通道)。 – datenwolf 2011-02-26 22:22:12

2

你的glBlendFuncGL_ONE, GL_ONE被称为添加剂混合,并具有良好的性质(如任何加法)是可交换的,也就是说A + B = B + A。

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

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

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

  • 先画你的天空盒,然后你的身高地图
  • 周围绘制的其他方式,与GL_DEPTH_TEST致能在Z缓冲区排序像素的知名度为你

希望这有助于