glScissor(0,0,0,0)硬崩溃Apple iOS设备

时间:2013-08-26 15:41:34

标签: iphone ios opengl-es-2.0

根据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时我也改变了我的动画计数器,从零开始而不是一个,所以很可能我遇到了同样的崩溃iOS 5) - 但是,这是因为这是一个iOS 6的错误,还是因为iOS 6改变了代码的时间,我无法分辨。很容易就是在iOS 5中我从未提交过0,0,0,0,而是提交了0,0,0,1作为我的第一个调用(剪刀是动画帧到帧)。


更新:高度可以为零,如果宽度为0,PowerVR只会崩溃。

x,y,(width == 0)? 1:宽度,高度 - 永远不会崩溃 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,宽度,高度)//每帧增加宽度和高度
    2. (将纹理3渲染到屏幕)

1 个答案:

答案 0 :(得分:0)

我刚试过,似乎按照我的预期工作。

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

...导致iPhone 5上的iOS 6.1.4完全没有呈现。使用非零大小的渲染也是如此。

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