3

根据 OpenGL 文档,这是合法的:

http://www.opengl.org/sdk/docs/man/xhtml/glScissor.xml

“并且 glScissor(0,0,0,0) 不允许修改窗口中的任何像素。”

...但是当我在 iOS 6 上执行此操作时,它会触发可怕的“PowerVR SGX 芯片崩溃”:

gpus_ReturnGuiltyForHardwareRestart()

在 iOS 5.x 上,我没有崩溃(更新:我刚刚发现从 5 移动到 6 时,我还将动画计数器更改为从零开始而不是从 1,所以我很可能在 iOS 5 上遇到了同样的崩溃) - 但这是因为这是 iOS 6 的错误,还是因为 iOS 6 改变了代码的时间,我不知道。很可能在 iOS 5 中我从未提交 0,0,0,0,而是提交 0,0,0,1 作为我的第一次调用(剪刀正在逐帧动画)。


更新:高度可以为零,只有宽度为 0 时 PowerVR 才会崩溃。

x,y,(宽度==0)?1 : width, height -- 永远不会崩溃 x, y, width, (height==0 ? 1 : height -- 只要 width==0 就会崩溃

注意:我已经检查、断言并使用日志记录来证明宽度和高度永远不会小于零(这是我的第一个想法!)


更多信息,可能相关(显然会导致以前的 Apple OpenGL 驱动程序出现问题):

我正在使用多个 FBO,并且对于我所做的每一帧:

  1. glBindFramebuffer(GL_FRAMEBUFFER, framebuffer1.glName);
    1. (渲染到纹理 1)
  2. glBindFramebuffer(GL_FRAMEBUFFER, framebuffer2.glName);
    1. (渲染到纹理 2)
  3. glBindFramebuffer(GL_FRAMEBUFFER, framebuffer3.glName);
    1. (从纹理 2 读取,渲染到纹理 3)
  4. [((GLKView*)self.view) bindDrawable];
    1. (将纹理 1 渲染到屏幕上)
  5. [((GLKView*)self.view) bindDrawable];
    1. glScissor( 0, 0, width, height ) // 每帧宽度和高度都会增加
    2. (将纹理 3 渲染到屏幕上)
4

1 回答 1

0

我刚刚尝试过,它似乎对我来说按预期工作。

glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, 0, 0);

...导致在 iPhone 5 上的 iOS 6.1.4 上根本没有渲染。使用非零大小也可以按预期进行渲染。

崩溃可能与某些与我不同的设置有关。我正在从GLKView. 如果您需要更多信息,请告诉我。例如,我可以在 iOS 7 设备上试用。

于 2013-08-26T16:10:42.593 回答