gpt4 book ai didi

opengl-es-2.0 - 如何停止透​​明纹理上的 OpenGL 背景流血

转载 作者:行者123 更新时间:2023-12-04 21:45:13 28 4
gpt4 key购买 nike

我有一个 iOS OpenGL ES 2.0 3D 游戏,我正在努力让透明纹理很好地工作,在这个特定的栅栏示例中。

我将从最终结果开始。一些绿色背景/清晰的颜色从围栏的边缘穿过 - 请注意它不是所有边缘,其中一些还可以:

Background bleed evidence

右上角没有出血的原因是操作顺序。从下面的照片中可以看出,绘制顺序包括一些在围栏之前绘制的建筑物。但大部分是在围栏之后:

Draw progression with depth

因此,一种解决方案是始终最后绘制我的透明纹理对象。我想探索其他解决方案,因为我的管道可能并不总是允许这样做。我正在寻找其他建议来解决这个问题,而无需对我的抽奖进行排序。

这可能是一个深度或混合函数,但我已经尝试了很多东西,但似乎没有任何效果(不同的混合函数、不同的丢弃 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);

任何修复此出血的建议都会很棒!

编辑 - 按照评论、LINEAR/NEAREST 中的建议尝试对纹理使用不同的最小过滤器,但结果相同。注意我也试过最近/最近但没有运气:

enter image description here

最佳答案

尝试增加 alpha 过滤器限制,
lowp vec4 texVal = texture2D(sTexture, texCoord);
if(texVal.w < 0.9)
discard;

关于opengl-es-2.0 - 如何停止透​​明纹理上的 OpenGL 背景流血,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314180/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com