OpenGL ES 2.0 FBO Creation خاطئ مع خطأ غير معروف
-
24-09-2019 - |
سؤال
لقد كنت أعاني من ذلك لفترة من الوقت الآن ، ويتعطل هذا الرمز ، بالنسبة لي ، أسباب غير معروفة. أقوم بإنشاء FBO ، وربط نسيج ، ثم تعطل أول GldrawArrays () مع "exc_bad_access" على جهاز محاكاة iPhone الخاص بي.
إليك الرمز الذي أستخدمه لإنشاء 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 ...
ما الخطأ الذي افعله؟
المحلول
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);
نصائح أخرى
جرب استخدام glGetError
بعد كل مكالمة GL. خاصة glTexImage2D
.
إذا كنت تستخدم Xcode ، فأضف نقطة الإيقاف لأخطاء OpenGL في "Breakpoint Navigator" ([+] -> [إضافة نقطة توقف خطأ OpenGL ES]). ثم سيتم عرض جميع مشاكل OpenGL على الخط ، حيث تظهر المشكلة.