GLScissors:什么是更快/更好?

时间:2010-11-30 07:50:10

标签: android opengl-es

我有一个小困境

我正在使用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);

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

1 个答案:

答案 0 :(得分:2)

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

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

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

在glHood下:

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

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

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