GLScissors:哪个更快/更好?

3

我有一个小问题。

我正在使用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个回答

4
这是有关glScissors的规范,因为在OpenGL中,glClear被视为绘图命令。所以你看到的行为是完全正常的(D3D也类似),但在其他手机上有漏洞,而在这些手机上,有趣的是它似乎对你起作用!
至于选择哪种解决方案,我不知道,两种都是有效的。我认为这是个人口味问题。我更喜欢第一种,因为更容易理解发生了什么。
如果在您的OpenGL实现中,第二种解决方案比第一种更快,那么我会选择第二种。做基准测试!
glHood下:
让我分享一下我对桌面GPU的了解并推测一下(不要太认真!)。glClear命令实际上会导致全屏四边形的绘制,因为在GPU上绘制三角形是“快速路径”。这可能比DMA或固定硬件更有效,因为它是并行的(所有着色器核心清除其屏幕的部分,颜色、z和模板),如果你这样做,就可以避免固定硬件的成本。
关于glScissor,我听说它是通过模板缓冲实现的(与通常的OpenGL模板缓冲相同的机制),因此只有落在剪刀区域内的片段可以参与深度目标、片段着色、混合等操作(这是为了避免专用硬件)。它也可以在现代GPU上通过片段丢弃+动态分支实现。
现在你可以看到为什么它会以这种方式工作。只有全屏四边形中位于剪刀区域内的片段才能“着色”颜色缓冲并清除它!

1
值得注意的是,当禁用glScissor(或覆盖整个缓冲区)时,您将获得更快的路径 - 驱动程序可以简单地使缓冲区无效,并写入单个颜色值以代替。这对于大多数移动设备上的平铺渲染器来说是一种特别大的优化。 - dos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接