2010-04-03 78 views
7

我一直在爲此苦苦掙扎了一段時間,而且這段代碼因爲未知原因而崩潰。我創建了一個FBO,綁定了一個紋理,然後第一個glDrawArrays()在我的iPhone模擬器上使用「EXC_BAD_ACCESS」崩潰。OpenGL ES 2.0 FBO創建出錯,出現未知錯誤

這是我用來創建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. 

當我把它叫做右T這裏。

所以,它崩潰了,診斷告訴我有一個未知的錯誤,我有點卡住了。我基本上從OpenGL ES 2.0編程指南中複製代碼...

我在做什麼錯?

+0

genpfault:你似乎已經腐壞了身體。請修復它。提前致謝。 – Nick 2010-07-08 20:13:23

回答

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

在每次總帳呼叫後嘗試使用glGetError。特別是glTexImage2D

+0

謝謝,這有很大的幫助。 – Nick 2010-04-05 10:40:34

0

如果您使用的XCode,在「斷點導航器」的OpenGL錯誤添加斷點([+] - > [添加OpenGL ES錯誤斷點])。然後所有的OpenGL問題將在線顯示,問題出現在哪裏。