Opengl es 在呈现renderbuffer之前,您的应用程序名为glInvalidateFramebuffer

Opengl es 在呈现renderbuffer之前,您的应用程序名为glInvalidateFramebuffer,opengl-es,ios10,glkit,Opengl Es,Ios10,Glkit,“在呈现renderbuffer之前,您的应用程序名为glInvalidateFramebuffer”,这是一条错误消息: int retVal = UIApplicationMain(argc, argv, nil, @"myAppDelegate"); 我的主.m文件 在我的项目中没有一个调用glInvalidateFramebuffer方法。此外,该项目使用OpenGL ES 2.0(使用GLKView运行),而有问题的方法是OpenGL ES 3.0的一部分 我使用大量的屏幕外帧缓冲区

“在呈现renderbuffer之前,您的应用程序名为
glInvalidateFramebuffer
”,这是一条错误消息:

int retVal = UIApplicationMain(argc, argv, nil, @"myAppDelegate");
我的主.m文件

在我的项目中没有一个调用
glInvalidateFramebuffer
方法。此外,该项目使用OpenGL ES 2.0(使用
GLKView
运行),而有问题的方法是OpenGL ES 3.0的一部分


我使用大量的屏幕外帧缓冲区来绘制程序纹理。在iOS 10之前未通知此错误。此外,它不会阻止渲染,不会显示任何可见问题,并且无法使用捕获帧指示其在代码中的确切位置(除了
main.m
)。

仅供参考。当我进行多重采样反别名时,我得到的信息与仪器8相同,但切换到仪器7时,信息消失了。我不是用GLKView,而是CaeAglayer运行。

这几乎可以肯定是XCode的GPU报告发出的错误警报

呈现时,不再需要多采样缓冲区和深度缓冲区。 多采样缓冲区已被解析,为了呈现像素,不再需要深度值

这意味着GLKView做了正确的事情:在演示之前使它们无效

注意:GLKViewDrawableMultiSampleOne而不是4x会消除错误警告


因此,在GLK的情况下,解析后的多采样缓冲区失效会触发该事件。

通常您希望在出现之前失效(例如,深度和模具通常是瞬态的,因此您不想保留它们,甚至不想将它们写入内存,尤其是在基于平铺的渲染器上)。在iOS上,你可以捕获一个帧,然后显示openGL API上的所有调用。它可能会帮助你获得更多关于正在发生的事情的信息。但一般来说,无论如何都要避免GLK,我知道它在启动应用程序时会有所帮助,但随着时间的推移,它只会限制您对应用程序管道的控制,因此您很容易会出现类似这样的错误。仅供参考。当我进行多重采样反别名时,我得到的信息与仪器8相同,但切换到仪器7时,信息消失了。我不是和GLKView一起跑,而是Caeaglayer。