Я пытаюсь получить на экране видеокадр в 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 , но затем приложение аварийно завершает работу. Любые мысли? Заранее спасибо.
int text [] = new int [1]; ??? int fbo = new int [1]; ??? Без обид, но, возможно, изучение того, как объявлять переменные и массивы в C++, было бы первым шагом перед тем, как вывести сцену текстуре: p. – Robinson
К сожалению, я виноват, это просто опечатка, когда вы чистите его, чтобы вставить его здесь. С другой стороны, написан на Java. Я просто обновил код avobe, как должен. Надеюсь, кто-то может понять, что я делаю неправильно. – PerracoLabs
Ах. Это Java. Вы можете вызвать int status = glCheckFramebufferStatus (GL_FRAMEBUFFER); и посмотреть, что он возвращает (после привязки буфера к использованию). – Robinson