Ошибка записи в OpenGL - PullRequest
       88

Ошибка записи в OpenGL

0 голосов
/ 23 сентября 2018

Не уверен, в чем проблема, он не смог прочитать пиксели при записи в несколько буферов рендеринга.Вот код:

код установки:

// gen framebuffer object
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

// gen renderbuffer 0
glGenRenderbuffers(1, &rbo_color0);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color0);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo_color0);

// gen renderbuffer 1
glGenRenderbuffers(1, &rbo_color1);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color1);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RED_INTEGER, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, rbo_color1);

// gen depth buffer
glGenRenderbuffers(1, &rbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo_depth);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

рендеринг и чтение пиксельного кода:

// setup shader and uniforms...
// bind framebuffer and clear color/depth buffer
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glEnable(GL_DEPTH_TEST);
glClearColor(0.f, 0.f, 0.f, 0.1f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

const GLuint buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, buffers);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, index_count, GL_UNSIGNED_INT, (void*)0);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, data);
glReadBuffer(GL_COLOR_ATTACHMENT1);
glReadPixels(x, y, 1, 1, GL_RED_INTEGER, GL_INT, (int*)(data) + 4);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

Я использовал квалификатор макета в шейдере для выходов, не долженТам не будет никаких проблем.Поэтому я думаю, что, возможно, что-то не так в настройке буфера или коде рендеринга.Я преуспел в чтении пикселей, когда есть только один рендер-буфер (rbo_color0).Основное отличие:

  1. без кода генерации для renderbuffer1;
  2. использование glDrawBuffer (rbo_color0) при рендеринге;
  3. формат rbo_color0 - GL_RGBA (дважды проверилнастройка формата в соответствующих вызовах glRenderbufferStorage / glReadBuffer, здесь нет проблем);
  4. нет вызова для чтения пикселей для rbo_color1.

Любая помощь?

1 Ответ

0 голосов
/ 23 сентября 2018

GL_RED_INTEGER не является правильным внутренним форматом, так как его можно использовать для второго параметра glRenderbufferStorage.Подходящая константа перечислителя для внутреннего формата будет GL_R32I.
См. Спецификация профиля совместимости API OpenGL 4.6;8,26.ЗАГРУЗКА И МАГАЗИНЫ ИЗОБРАЖЕНИЯ ТЕКСТУРЫ;стр. 334

Если вы проверите ошибки в OpenGL (glGetError), вы получите ошибку INVALID_ENUM.

Измените буфер рендерингаспецификация хранилища, чтобы решить проблему:

glRenderbufferStorage(GL_RENDERBUFFER, GL_R32I, w, h); 

Обратите внимание, вы должны проверить полноту кадрового буфера по glCheckFramebufferStatus:

GLenum fb_status = glCheckFramebufferStatus( GL_FRAMEBUFFER );
if ( fb_status != GL_FRAMEBUFFER_COMPLETE )
{
  // error handling
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...