【发布时间】:2013-03-09 18:14:16
【问题描述】:
我有一个 iOS OpenGL ES 2.0 3D 游戏,并且正在努力让透明纹理正常工作,在这个特定的栅栏示例中。
我将从最终结果开始。绿色背景/清晰的颜色从栅栏的边缘穿过——注意它不是所有的边缘,有些是好的:
右上角没有出血的原因是操作顺序。从下面的镜头中可以看出,绘制的顺序包括一些在围栏之前绘制的建筑物。但大部分是在围栏之后:
因此,一种解决方案是始终最后绘制透明纹理对象。我想探索其他解决方案,因为我的管道可能并不总是允许这样做。我正在寻找其他建议来解决这个问题,而不是对我的抽奖进行排序。
这可能是一个深度或混合功能,但我尝试了很多东西,但似乎没有任何效果(不同的混合功能、不同的丢弃 Alpha 级别、不同的背景颜色、不同的纹理设置)。
以下是我的实现的一些细节。
在我的片段着色器中,我丢弃了具有透明度的片段 - 这样它们就不会渲染到深度:
lowp vec4 texVal = texture2D(sTexture, texCoord);
if(texVal.w < 0.5)
discard;
我正在使用一个带有 mipmapping 的巨型 PVR 纹理图集 - 纹理本身应该只有 0 或 1 用于 alpha,但混合可能会导致这种情况:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
我在渲染时使用了以下混合:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
任何修复这种出血的建议都会很棒!
编辑 - 按照 cmets 中建议的 LINEAR/NEAREST 尝试不同的纹理最小过滤器,但结果相同。注意我也尝试过 NEAREST/NEAREST 并且没有运气:
【问题讨论】:
-
在你的 mipmap 中尝试最近的邻居。 GL_LINEAR_MIPMAP_NEAREST
-
谢谢 - 刚刚试了一个,结果相同。我之前尝试过其他一些,但结果相同或相似。
-
你能试试吗?而不是丢弃,为片段返回透明颜色 (0,0,0,0)。
-
好建议 - 问题是那些片段将被渲染到深度缓冲区,导致在栅栏之后绘制的东西甚至不会传递给片段着色器。试过了,但我最终在篱笆后面几乎全是绿色的。
-
您是否禁用(完全 - 驱动程序控制面板)抗锯齿?
标签: opengl-es-2.0 transparency