FBO связан, но ничто не втягивается в это

Я создаю мини-игровой движок с использованием C ++ и OpenGL 3.3, почти все настроено, кроме эффектов постобработки. Я начал читать о кадровых буферах и подумал, что это не будет проблемой, насколько я ошибался …

Похоже, кадровые буферы как-то не используются после связывания. Посмотрите пример кода:

....
GLuint FBO;
glViewport(0, 0, 800, 600);
glLoadIdentity();
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);

GLuint texColorBuffer;
glGenTextures(1, &texColorBuffer);
glBindTexture(GL_TEXTURE_2D, texColorBuffer);

glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL
);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0
);

GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, drawBuffers);

GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cout << "Not completed!" << std::endl;

// Clear the screen
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// Read the framebuffer pixels back to check if it 'cleared' to white
unsigned char *img = new unsigned char[104857600];
glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, img);
std::cout << img << std::endl;
delete[] img;

exit(1);
....

Но как только я читаю пиксели кадрового буфера, я ничего не получаю, просто большой пустой блог (например, множество концовок строк). Что-то не так с этим кодом? Кроме того, я почти уверен, что OpenGL настроен правильно, у меня много рисования после этого «тестового» блока кода.

редактировать

Вот флаги инициализации, которые я использую:

// Initializes and binds VAO (vertex arrary object)
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);

// Enabling stuff
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Other
glDisable(GL_DEPTH_TEST);

Я также использую SDL 2.0.1, GLEW (последний выпуск до этой даты) и TDM-GCC (GCC 4.8.1)

История обновлений:

  1. Модифицированный код с опубликованными предложениями (проверка статуса и glTexSubImage2D)
  2. Удалено glTexSubImage

0

Решение

Прочитайте данные о возврате пикселей из FrameBuffer, но вы рендеритесь в текстуру, поэтому используйте
glGetTexImage или TexSubImage2D, чтобы получить то, что было нарисовано на вашей текстуре.

Если вы все еще хотите использовать readPixel вместо этого, создайте renderBuffer и свяжите его с glFramebufferRenderbuffer, или вы также можете использовать GL_READ_FRAMEBUFFER или GL_DRAW_FRAMEBUFFER при создании вашего fbo, чтобы разрешить использование readPixel.

....
GLuint FBO;
glViewport(0, 0, 800, 600);
glLoadIdentity();
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);

GLuint texColorBuffer;
glGenTextures(1, &texColorBuffer);
glBindTexture(GL_TEXTURE_2D, texColorBuffer);

заменить:

glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL
);

от:

glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL
);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0
);

GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, drawBuffers);

GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cout << "Not completed!" << std::endl;

// Clear the screen
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// Read the framebuffer pixels back to check if it 'cleared' to white
unsigned char *img = new unsigned char[104857600];

заменить:

glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, img);

от:

glGetTexImage(  GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);

std::cout << img << std::endl;
delete[] img;

exit(1);
....
-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]