虽然较近的部分是透明的,但远处的部分是看不见的

问题描述 投票:2回答:2

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);
opengl opengl-es glsl
2个回答
2
投票

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

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

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

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


0
投票

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

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

解:

if(gl_FragColor.a < 0.5)
        discard;

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

谢谢大家的时间。

© www.soinside.com 2019 - 2024. All rights reserved.