2014-09-04 2 views
0

Я создаю приложение для iPad с использованием OpenGL ES 2.0. Мне нужно сделать несколько текстур, а затем отобразить все текстуры. Я рисую с использованием GL_POINTS на основе пользовательского местоположения. Мой код, который у меня сейчас:OpenGL ES 2.0 рендеринг для нескольких текстур

Сформировать буфера кадра, текстур, и сделать буфер:

glGenFramebuffers(1, &viewFramebuffer); 
glGenRenderbuffers(1, &viewRenderbuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 

glGenTextures(1, layers); 
glBindTexture(GL_TEXTURE_2D, layers[0]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.bounds.size.width, self.bounds.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layers[0], 0); 

Draw:

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
.... 
glDrawArrays(GL_POINTS, 0, (int)vertexCount); 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

выше работает хорошо, однако, когда я хочу, чтобы оказать новая текстура мое приложение прекращает рисовать любой новый контент. Я связываю новую текстуру следующим образом:

glGenTextures(1, &layers[1]); 
glBindTexture(GL_TEXTURE_2D, layers[1]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.bounds.size.width, self.bounds.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layers[1], 0); 

И снова вызовите метод рисования. Мой код работает при рендеринге первой текстуры, но когда я пытаюсь создать новую текстуру для рендеринга, приложение перестает рисовать. Может ли кто-нибудь помочь?

+0

Скорее всего, не имеет ничего общего с вашей проблемой, но есть ли причина, почему вы частично с использованием версии расширения (OES) точек входа FBO и определения ? –

+0

@RetoKoradi Не знаете, почему это было. Я следую учебнику от GLPaint от Apple, и именно так оно и было сделано. Я изменил GL_FRAMEBUFFER_OES на GL_FRAMEBUFFER, но проблема не устранена. Какие-либо предложения? – Amendale

+1

Вы проверяете состояние буфера кадра после того, как это новое вложение? Правильный буфер кадра должен быть связан не только с текстурой, прежде чем выполнить эту строку (но это, скорее всего, уже есть). Во всяком случае, я не уверен, что вы даже можете это сделать, но если все, что вы сделали, все в порядке, я бы ожидал, что обе текстуры будут привязаны к буфере кадров, поэтому он должен привлечь к обоим. Во всяком случае, почему вы даже пытаетесь это сделать, вы можете просто создать новый буфер кадров и прикрепить текстуру. Что касается буфера визуализации, если я правильно помню, он вам не нужен, если у вас есть текстура. –

ответ

3

Я получил свой код для работы. У меня было несколько проблем с тем, что мои frameBuffers не генерируются правильно, и мои текстуры не привязываются точно. Извлеченный урок - всегда проверяйте состояние frameBuffer после поколения! Вот оно:

установки фреймбуферов:

// Generate textureFrameBuffer for handling drawing to textures 
glGenFramebuffers(1, &textureFrameBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, textureFrameBuffer); 

// Generate renderBufferer for drawing to screen 
glGenRenderbuffers(1, &viewRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(id<EAGLDrawable>)self.layer]; 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); 

//Generate first texture and bind to textureFrameBuffer 
glGenTextures(1, &layers[0]); 
glBindTexture(GL_TEXTURE_2D, layers[0]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layers[0], 0); 

//check if frameBuffer is OK 
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){ 
    NSLog(@"failed to make complete framebuffer objects %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
    return NO; 
} 

//Generate viewFrameBuffer for drawing to view 
glGenFramebuffers(1, &viewFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); 

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{ 
    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
} 

привлечь к первой текстуры:

glBindFramebuffer(GL_FRAMEBUFFER, textureFrameBuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layers[0], 0); 
.... 
glDrawArrays(GL_POINTS, 0, (int)vertexCount); 

генерировать и связывают вторую текстуру:

glGenTextures(1, &layers[1]); 
glBindFramebuffer(GL_FRAMEBUFFER, textureFrameBuffer); 
glBindTexture(GL_TEXTURE_2D, layers[1]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layers[1], 0); 

притягивать к второй текстуры:

glBindFramebuffer(GL_FRAMEBUFFER, textureFrameBuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layers[1], 0); 
.... 
glDrawArrays(GL_POINTS, 0, (int)vertexCount); 

Чтобы нарисовать все текстуры для экрана:

// Bind view buffer 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 
//clear screen every frame 
glClear(GL_COLOR_BUFFER_BIT); 
//bind layer texture 
for (int i=0; i<= layerCount; i++) { 
    glBindTexture(GL_TEXTURE_2D, layers [i]); 
    .... 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
} 

[context presentRenderbuffer:viewFramebuffer]; 
+0

Спасибо! было очень трудно получить две текстуры для рендеринга, прежде чем я нашел ваш пост. Это отлично поработало. –

Смежные вопросы