Ошибка рендеринга с кадровым буфером GLSL - PullRequest
2 голосов
/ 24 марта 2012

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

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

 // 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, но затем приложение вылетает. Какие-нибудь мысли? Заранее спасибо.

1 Ответ

2 голосов
/ 24 марта 2012

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

...