gpt4 book ai didi

ios - glGetError() 直到下一帧才起作用

转载 作者:行者123 更新时间:2023-12-01 18:55:04 24 4
gpt4 key购买 nike

我正在尝试调试这个我没有编写的渲染循环。某处出现错误导致程序崩溃,但是 glGetError()似乎表现得很好笑。

这在 iOS 上,我正在使用 GLKViewController , GLKViewEAGLContext画。

渲染循环的一个非常概括的版本是这样的:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// At this point, GLKView's EAGLContext should be the active context

checkGlGetError();

if (!isTextureInit || geometryChanged)
{
setupRenderTextureAndRenderbuffer();
}
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_originalFramebufferId);
glBindFramebuffer(GL_FRAMEBUFFER, _framebufferId);

// a. Some complex operations
// b. Some rendering on the texture framebuffer

glBindFramebuffer(GL_FRAMEBUFFER, _originalFramebufferId);

// c. Some additional complex operations
// d. Render the texture on screen

checkGlGetError();
}

这会使应用程序崩溃。问题是最后一个 checkGlGetError()调用第一个渲染帧,不会产生任何错误(屏幕上没有任何显示)。

第一个 checkGlGetError()调用第二个渲染帧会给出一个神秘的 GL_INVALID_ENUM ,不久之后应用程序崩溃。

如果我用这个替换我的渲染循环:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
checkGlGetError();

// a. Some complex operations
// b. Some rendering on the screen

checkGlGetError();
}

一切正常,没有错误报告。但是:为什么不 glGetError()在错误的 OpenGL 调用后立即捕获错误?为什么它只在下一帧开始时报告它?

有错误的代码很长,并且没有更多的迹象表明错误的确切位置,调试起来非常困难。

更新

我上传了所有代码 here .这是 Google's CardboardSDK 的正在进行中的端口( decompiled ) 从 Java 到我正在尝试完成的 Objective-C++。

主渲染循环位于 CardboardViewController类(class)。导致崩溃的 OpenGL 命令应该在 DistortionRenderer 上。类(其功能是采用普通的立体视口(viewport)并将它们渲染到纹理上,以便将镜头失真应用于每个视口(viewport))。

如果设置 CardboardViewControllerdistortionCorrectionEnabledNO ,崩溃消失。

最佳答案

这里没有足够的信息来调试您的问题,因此,请提供有关调试的一般说明...
glGetError一般来说,调试 GL 问题是一种糟糕的方法,尤其是在 iOS 中,当您使用 GLKView 时更是如此或其他代表您执行 GL 工作的系统。很可能您正在设置一些在 GLKView 之前不会导致错误的状态。开始向 GPU 提交内容(当您的 drawRect:/glkView:drawInRect: 返回时)。

尝试使用 Xcode Frame Capture tool反而。而不是要求您粘贴 glGetError检查您的所有代码(并确保它们在发布版本中被禁用)然后尝试理解结果,它会向您显示每次调用的错误(至少有一定程度的解释),包括在您的代表系统代码。它显示了完整的状态图,以及逐个调用渲染的帧的快照,因此您可以更早地判断您是否正在设置导致问题的某些状态。

好的,可能是针对您的问题的一种想法:尝试使用 bindDrawableGLKView而不是直接用 glBindFramebuffer 重新绑定(bind)其帧缓冲区.

关于ios - glGetError() 直到下一帧才起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com