【问题标题】:glScissor(0,0,0,0) hard-crashes Apple iOS devicesglScissor(0,0,0,0) 硬崩溃 Apple iOS 设备
【发布时间】: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,并且对于我所做的每一帧:

  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 渲染到屏幕上)

【问题讨论】:

  • 这似乎是一个重大错误。如果可以的话,我强烈建议在 iOS 7 测试版上对其进行测试,如果仍然损坏,请立即向苹果提交雷达。
  • 我没有备用设备可以安装 iOS 7 :(。目前,我正在使用上面的解决方法(它可以防止崩溃),我会在何时重新访问iOS 7 已经发布。

标签: iphone ios opengl-es-2.0


【解决方案1】:

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

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

...在 iPhone 5 上的 iOS 6.1.4 上根本不会渲染。使用非零大小也会按预期进行渲染。

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

【讨论】:

  • 啊...一件事可能是相关的。如果您正在切换 FBO,我在网上发现了一些关于 glScissor 在某些硬件上被破坏的报告,并且我在 4 个 FBO(我的 3 个,最后是 [GLKView bindDrawable] 带回 Apple 并进行最终渲染)之间切换)
  • @Adam 你能创建一个展示崩溃的小示例项目吗?
  • 我试过了,但 Apple 的 Xcode 模板打败了我 - 将他们的手写顶点等转换为简单、有效的 GLKit 代码需要很长时间。我没有时间修复他们的模板以及诊断我已经找到解决方法的问题(不要发送 0 宽度)。当我有时间从头开始编写一个正确使用 GLKit 的有效 Xcode 模板时,我会再试一次。
猜你喜欢
  • 2017-03-08
  • 2015-10-22
  • 2012-08-30
  • 2015-10-11
  • 1970-01-01
  • 2018-03-02
  • 2012-12-06
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多