لا يعمل EaGlContext على OpenGles 1 iPhone OS
-
01-10-2019 - |
سؤال
لدي مشروع ثلاثي الأبعاد يعتمد على Eaglview exemple من Apple.
لدي خطأ غريب للغاية مع السياق (على ما أظن) ، يتم إنشاء سياقي باستخدام:
Context RenderBufferStorage: gl_renderbuffer_oes fromDrawable: (CaeAgllayer*) self.layer] ؛
في برنامج العرض ثلاثي الأبعاد ، يعمل عمله ، وعلى Layout Subview ، يقوم FrameBuffer بتدمير إنشاء مرة أخرى. ولكن في بعض الحالات ، لا يتم إنشاء FrameBuffer. لقد بحثت مع مصحح الأخطاء ، لقد وجدت أن المشكلة تصبح من سياق "الخلق":
- (BOOL)createFramebuffer
{
NSLog(@"[EAGLVIEW] create framebuffer");
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
//////// HERE, some time the context is 0 /////////
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
//////////////////////
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
// On génère le tampon de profondeur -- bah oui, on fait de la 3D
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
// On paramètre le tampon :
// - avec les dimensions que l'on veut
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
//glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES, backingWidth, backingHeight);
// - avec la profondeur que l'on veut
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
لا أفهم لماذا يعمل أم لا. عندما يكون لدي هذا الخطأ ، أقوم بتحويل جهاز iPhone الخاص بي إلى القوة لتنفيذ LayoutSubview ، وهو يعمل. انه غريب جدا.
ما هو سبب عدم إنشاء السياق في الثانية ولا بأس بعد.
المحلول
لم تنشر الرمز الذي يوضح كيف قمت بإنشاء السياق بالفعل ، فقط باستخدامه. يجب أن يبدو إنشاء السياق الخاص بك شيئًا كهذا
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context])
return false;
وإذا كان السياق هو 0 (وهو ما يعني عدم وجوده ، فستكتشفه قبل اليد.