سؤال

لقد كنت أعاني من ذلك لفترة من الوقت الآن ، ويتعطل هذا الرمز ، بالنسبة لي ، أسباب غير معروفة. أقوم بإنشاء 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 على الخط ، حيث تظهر المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top