根据 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,并且对于我所做的每一帧:
- glBindFramebuffer(GL_FRAMEBUFFER, framebuffer1.glName);
- (渲染到纹理 1)
- glBindFramebuffer(GL_FRAMEBUFFER, framebuffer2.glName);
- (渲染到纹理 2)
- glBindFramebuffer(GL_FRAMEBUFFER, framebuffer3.glName);
- (从纹理 2 读取,渲染到纹理 3)
- [((GLKView*)self.view) bindDrawable];
- (将纹理 1 渲染到屏幕上)
- [((GLKView*)self.view) bindDrawable];
- glScissor( 0, 0, width, height ) // 每帧宽度和高度都会增加
- (将纹理 3 渲染到屏幕上)