2012-03-24 5 views
2

Я пытаюсь получить на экране видеокадр в 2-й текстуре, покрывающей экран, я должен использовать фреймбуферы, потому что в конце концов я хочу сделать технику рендеринга пинг-понга. Но пока я хочу, чтобы в первую очередь нужно было просто визуализировать на экране, используя фреймбуферы.Ошибка рендеринга с фрейм-буфером GLSL

Это мой код установки:

// Texture setup 

int[] text = new int[1]; 
glGenTextures(1, text, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, text[0]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 512, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, null); 

// Frambuffer setup 

int[] fbo = new int[1]; 
glGenFramebuffers(1, fbo, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, text[0], 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

До здесь все в порядке, я не пишу здесь код тестирования, чтобы сохранить его небольшим, но сразу после того, как я могу проверить, если буфер кадров был создан правильно, и Все хорошо.

Теперь в моем рендер цикле делать дальше:

// Use the GLSL program 

glUseProgram(programHandle); 

// Swap to my FBO 

glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); 
glViewport(0, 0, 512, 512); 

// Pass the new image data to the program so the fragment shader processes it. 
// Using glTexSubImage2D to speed up 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, text[0]); 
glUniform1i(glGetUniformLocation(programHandle, "u_texture"), 0); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_LUMINANCE, GL_UNSIGNED_BYTE, NewImageData); 

// Draw the quad 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Swap back to the default screen frambuffer 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

На данный момент я получаю черный экран, и на бревне я вижу GL_INVALID_FRAMEBUFFER_OPERATION 1286. Я попытался положить в glDrawArrays после вызова glBindFramebuffer , но затем приложение аварийно завершает работу. Любые мысли? Заранее спасибо.

+0

int text [] = new int [1]; ??? int fbo = new int [1]; ??? Без обид, но, возможно, изучение того, как объявлять переменные и массивы в C++, было бы первым шагом перед тем, как вывести сцену текстуре: p. – Robinson

+0

К сожалению, я виноват, это просто опечатка, когда вы чистите его, чтобы вставить его здесь. С другой стороны, написан на Java. Я просто обновил код avobe, как должен. Надеюсь, кто-то может понять, что я делаю неправильно. – PerracoLabs

+0

Ах. Это Java. Вы можете вызвать int status = glCheckFramebufferStatus (GL_FRAMEBUFFER); и посмотреть, что он возвращает (после привязки буфера к использованию). – Robinson

ответ

2

LUMINANCE текстуры не визуализируются, это означает, что вы не можете визуализировать их с помощью FBO. Эта проблема решается с расширением GL_ARB_texture_rg, которое представляет один и два канала форматов текстур, которые являются рендерируемыми.

+0

Код должен быть запущен на Android, поэтому я не могу использовать расширение, которое может не распространяться на все модели телефонов. поэтому я думаю, что мне нужно переосмыслить весь подход. – PerracoLabs