繁体   English   中英

OpenGL ES 1.1中的GL_ALPHA_TEST替换(无着色器)

[英]GL_ALPHA_TEST replacement in OpenGL ES 1.1 (no shaders)

因此,似乎GL_ALPHA_TEST在iOS上的性能非常差。 引用苹果

在计算片段的颜色值之前,图形硬件通常在图形管道的早期进行深度测试。 如果您的应用程序在OpenGL ES 1.1中使用alpha测试或在OpenGL ES 2.0片段着色器中使用discard指令,则必须禁用某些硬件深度缓冲区优化。 尤其是,这可能需要完全计算出片段的颜色,才将其丢弃,因为该片段不可见。

使用alpha测试或丢弃杀死像素的另一种方法是使用alpha混合,将alpha强制设置为零。 这有效消除了对帧缓冲区颜色的任何影响,同时保留了Z缓冲区优化。 这确实会更改深度缓冲区中存储的值,因此可能需要对透明图元进行从前到后的排序。

如果需要使用Alpha测试或discard指令,请在处理不需要的所有图元之后在场景中分别绘制这些对象。 discard指令尽早放置在片段着色器中,以避免执行未使用结果的计算。

我想知道:“使用alpha混合并将alpha强制设置为零”到底是什么意思。 你怎么能做到这一点? 另外,还有其他方法可以根据像素的alpha值来忽略/隐藏像素吗?

我考虑过使用纹理组合器或各种混合模式(包括glBlendFuncSeparateOES )。 但是,似乎没有什么合适的工作。 我想拥有一个单独的Alpha纹理并使用纹理组合器是可行的。 不过,我真的更希望只使用一种纹理。

这个问题是深刻的,与深度缓冲器有关。 您可以在着色器代码中将alpha设置为零,但仍然会输出深度片段,因此这只是部分解决方法,具体取决于您使用alpha测试的原因。 因此,您可以对alpha进行缩放并进行大比例缩放(以避免着色器分支),然后进行钳制,您将获得清晰的勾勒出的alpha测试边缘,但是透明像素仍将填充zbuffer,如果这是您使用alpha测试的原因,仍然没有更好的状况。 您无法真正解决着色器中的核心问题。 您可以调整内容以最小化此内容,并可能绘制不透明的未经测试的z,最后进行经过alpha测试的透明性。 如何影响z的细节在各个平台之间都非常重要。 在某些平台上,从那时起直到下一次清除之前,可能会永久禁用zbuffer优化(例如早期z和粗z),因此在延迟alpha测试中可以获得性能,但这实际上取决于实现的细节。

调整图稿以最小化透明片段,并在无法避免的情况下在渲染时尽可能晚地使用alpha测试。

另外,如果您具有丢弃功能,则可以在着色器的末尾针对恒定的alpha测试使用它,这可能是违反直觉的,但是某些实现方式会优化此alpha测试丢弃以使用固定功能硬件,这比着色器分支更好(在某些平台上) )。 同样,这实际上取决于GPU线程流控制的复杂程度。 拥有高效分支功能的未来平台可能会从早期的操作中受益,您基本上是在尝试利用隐藏的实现优化的方式,这些优化因平台而异,并且会在未来发生变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM