android - GLScissors : what is faster/better?

标签 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);

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

最佳答案

这是 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/

相关文章:

android - Firebase 消息传递 - 在 Android 中请求 token 时如何设置发件人 ID?

Android - 如何使用 opengl-es 在 3D 立方体上渲染视频纹理?

java - Google Play 'Open Testing'(= 抢先体验): 'Release not live' error message

android - 即使应用程序被杀死,也会在特定时间从 Android 操作系统获取通知

java - 集成 Paytm 支付网关 Android

java - 如何在某个变量值变化时触发onPerformSync

javascript - 用户在 three.js 中上传纹理

java - 如何在 run() 方法内部传递 GL10 对象

ios - WebGL:OES_texture_float 是否需要存储为 32 位 float ?有些设备似乎只存储半 float

c++ - 不同情况下如何处理多条法线的顶点?