繁体   English   中英

GLScissors:什么是更快/更好?

[英]GLScissors: what is faster/better?

我有一个小困境。

我正在使用Android(并不是相关的)我在某些手机而不是其他手机上注意到一件事:剪刀会阻止调用glClear(GL_COLOR_BUFFER_BIT)正常工作。

因此,我想知道它是否更好:

gl.glDisable(GL10.GL_SCISSOR_TEST);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glEnable(GL10.GL_SCISSOR_TEST);

要么

gl.glScissors(0,0,800,480);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

基本上,最好在清除之前更换为剪刀测试区,还是最好禁用/启用?

这是glScissors的规范,因为glClear在OpenGL中被视为绘图命令。 所以你看到的行为是完全正常的(D3D的工作方式类似),但是其他手机上的马车似乎很有趣,你似乎可以工作!

关于选择哪种解决方案,我不知道,两者都是有效的。 我会说这是一个品味问题。 我更喜欢第一个,因为它更容易弄清楚会发生什么。

现在,如果你的OpenGL实现第二个解决方案比第一个解决方案更快,我会选择第二个解决方案。 基准!

在glHood下:

让我分享一下我在台式机GPU上所知道的东西并猜测一下(不要太认真!)。 glClear命令实际上会导致绘制全屏四边形,因为绘制三角形是GPU上的“快速路径”。 这可能比DMA或固定硬件更有效,因为它是并行的(所有着色器核心清除其屏幕部分,颜色,z和模板),如果这样做,您可以避免固定硬件的成本。

关于glScissor ,我听说它是​​通过模板缓冲实现的(与通常的OpenGL模板缓冲区相同的机制),因此只有落入剪刀区域的碎片才能参与深度dest,片段着色,混合等(这是出于同样的原因) glClear ,避免使用专用硬件)。 它也可以在现代GPU上实现为片段丢弃+动态分支。

现在你可以看到它为什么这样工作了。 只有位于剪刀区域内的全屏四边形片段才能“遮蔽”颜色缓冲区并清除它!

暂无
暂无

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

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