【发布时间】:2013-08-30 00:19:30
【问题描述】:
根据 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 : 宽度,高度——从不崩溃 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 渲染到屏幕上)
【问题讨论】:
-
这似乎是一个重大错误。如果可以的话,我强烈建议在 iOS 7 测试版上对其进行测试,如果仍然损坏,请立即向苹果提交雷达。
-
我没有备用设备可以安装 iOS 7 :(。目前,我正在使用上面的解决方法(它可以防止崩溃),我会在何时重新访问iOS 7 已经发布。
标签: iphone ios opengl-es-2.0