虽然更接近的部分是透明的

时间:2018-01-01 11:31:11

标签: opengl opengl-es glsl

enter image description here

在上图中,树木被批量绘制,我尝试使用z位置绘制较大树前面的小树,而不管它们是否被添加到绘图中。我也使用了正交投影。

不幸的是,我使用的是一个未知的游戏引擎,开发者要么不活跃,要么只是不在乎这就是为什么我希望有人在这里可以提供帮助,但要点就是这个:

start batch drawing
draw small tree at location: x, y, 1  // 1 to make it appear in front
draw big tree at location: x, y, 0
end batch drawing

在OpenGL / glsl应用程序中,为了做这样的工作,一般要做些什么?

我已经尝试过等同于

glEnable( GL_BLEND );
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

2 个答案:

答案 0 :(得分:2)

您似乎遇到的问题是“使用非不透明的alpha值绘制”和“实际上是透明的”之间的区别。

OpenGL(以及大多数其他简单的基于alpha的渲染技术)无法实现这种透明度,即已绘制元素后面的绘图会使新绘制元素的一部分(部分)可见。
任何新绘制的非不透明像素的颜色都是其自身颜色和该位置上已有颜色的混合。即只存在两个输入值 混合由新绘制像素的α值控制 “已经在那个地方”的颜色已经丢失了有关颜色和alpha值的信息。

在你的图片中可见的问题是由于除了α控制的混合物之外还有更接近观察者的其他元素的z控制影响。 Alpha值不会影响混合,最重要的元素只会赢。这包括已经绘制的那些更接近元素的部分或甚至完全“透明”部分(有或没有异形影响)。

因此,正如评论中已提到的那样,其中的要点是 使用简单的alpha渲染机制,您必须按时间顺序对渲染进行排序。

答案 1 :(得分:0)

我想我的第二条评论并不清楚。我已经找到了问题,这是解决方案。

问题:片段着色器中不会丢弃alpha

解决方案:

if(gl_FragColor.a < 0.5)
        discard;

我不知道它是否是最好的解决方案,但对于像素艺术精灵来说已经足够了。

感谢大家的时间。