我一直在努力解决这个问题,而且这个代码对我来说是不明原因的。我正在创建一个FBO,绑定一个纹理,然后第一个glDrawArrays()在我的iPhone模拟器上崩溃了“EXC_BAD_ACCESS”。
这是我用来创建FBO(和绑定纹理......)的代码
glGenFramebuffers(1, &lastFrameBuffer);
glGenRenderbuffers(1, &lastFrameDepthBuffer);
glGenTextures(1, &lastFrameTexture);
glBindTexture(GL_TEXTURE1, lastFrameTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 768, 1029, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//Bind/alloc depthbuf
glBindRenderbuffer(GL_RENDERBUFFER, lastFrameDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1029);
glBindFramebuffer(GL_FRAMEBUFFER, lastFrameBuffer);
//binding the texture to the FBO :D
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lastFrameTexture, 0);
// attach the renderbuffer to depth attachment point
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, lastFrameDepthBuffer);
[self checkFramebufferStatus];
正如您所看到的,它参与了一个对象,checkFrameBufferStatus如下所示:
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE:
JNLogString(@"Framebuffer complete.");
return TRUE;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
JNLogString(@"[ERROR] Framebuffer incomplete: Attachment is NOT complete.");
return false;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
JNLogString(@"[ERROR] Framebuffer incomplete: No image is attached to FBO.");
return false;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
JNLogString(@"[ERROR] Framebuffer incomplete: Attached images have different dimensions.");
return false;
case GL_FRAMEBUFFER_UNSUPPORTED:
JNLogString(@"[ERROR] Unsupported by FBO implementation.");
return false;
default:
JNLogString(@"[ERROR] Unknown error.");
return false;
JNLogString只是一个NSLog,在这种情况下它给了我:
2010-04-03 02:46:54.854 Bubbleeh[6634:207] ES2Renderer.m:372 [ERROR] Unknown error.
当我在那里打电话时。
所以,它崩溃了,诊断告诉我有一个未知的错误,我有点卡住了。我基本上复制了OpenGL ES 2.0编程指南中的代码......
我做错了什么?
答案 0 :(得分:3)
glBindTexture(GL_TEXTURE1, lastFrameTexture);
这是不允许的,我试图将纹理绑定到第一单元(GL_TEXTURE1),但这应该由glActiveTexture()完成,而不是glBindTexture(),它想要知道纹理的类型(GL_TEXTURE_2D,GL_TEXTURE_3D)等)不是纹理单位。要在纹理单元1中放置纹理,我现在有以下代码,我认为是正确的:
//Bind 2D Texture lastFrameTexture to texture unit 1
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, lastFrameTexture);
答案 1 :(得分:1)
在每次GL通话后尝试使用glGetError
。特别是glTexImage2D
。
答案 2 :(得分:0)
如果您使用XCode,请在" Breakpoint Navigator"中为OpenGL错误添加断点。 ([+] - > [添加OpenGL ES错误断点])。然后所有OpenGL问题都将在线显示,出现问题。