我遇到了一个小难题。
我正在使用 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模板缓冲区相同的机制),所以只有落入剪刀区域的 fragment 才能参与深度目标、 fragment 着色、混合等(这样做的原因与 glClear
相同,避免使用专用硬件)。它也可以在现代 GPU 上实现为 fragment 丢弃+动态分支。
现在您可以明白为什么它会这样工作了。只有位于剪刀区内的全屏四边形 fragment 才能“遮蔽”颜色缓冲区并将其清除!
关于android - GLScissors : what is faster/better?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4311579/