Преобразовать обратную связь без фреймбуфера?

Я заинтересован в использовании вершинного шейдера для обработки буфера без создания какого-либо визуализированного вывода. Вот соответствующий фрагмент:

glUseProgram(program);

GLuint tfOutputBuffer;
glGenBuffers(1, &tfOutputBuffer);
glBindBuffer(GL_ARRAY_BUFFER, tfOutputBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(double)*4*3, NULL, GL_STATIC_READ);

glEnable(GL_RASTERIZER_DISCARD_EXT);

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfOutputBuffer);
glBeginTransformFeedbackEXT(GL_TRIANGLES);

glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
glEnableVertexAttribArray(positionAttribute);
glVertexAttribPointer(positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(double)*4, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);

glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, 0);

Это работает нормально до вызова glDrawElements(), который приводит к GL_INVALID_FRAMEBUFFER_OPERATION. И glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); возвращает GL_FRAMEBUFFER_UNDEFINED.

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

Итак, есть ли способ использовать обратную связь преобразования без фреймбуфера, или мне нужно сгенерировать и привязать фреймбуфер, даже если мне все равно на его содержимое?


person smokris    schedule 09.06.2014    source источник
comment
Что вы ожидаете от glCheckFramebufferStatus (...), если у вас нет привязки FBO и нет фреймбуфера по умолчанию? GL_FRAMEBUFFER_UNDEFINED возвращается, если target является буфером кадра по умолчанию, но буфер кадра по умолчанию не существует.   -  person Andon M. Coleman    schedule 09.06.2014
comment
Я был просто удивлен, когда вообще получил ошибку, связанную с фреймбуфером, так как у меня сложилось впечатление, что GL_RASTERIZER_DISCARD_EXT означает, что фреймбуфер не нужен. Итак, я получил больше информации о ситуации с фреймбуфером и включил эту информацию сюда на случай, если она поможет ответить на вопрос.   -  person smokris    schedule 09.06.2014


Ответы (1)


На самом деле это совершенно правильное поведение, согласно спецификации.

Основная спецификация OpenGL 4.4 — 9.4.4 Влияние полноты буфера кадра об операциях с фреймбуфером

Ошибка GL_INVALID_FRAMEBUFFER_OPERATION возникает при попытках рендеринга или чтения из кадрового буфера, который не заполнен. Эта ошибка генерируется независимо от того, считываются ли фрагменты из кадрового буфера или записываются в него. Например, он генерируется, когда вызывается команда рендеринга, а кадровый буфер не заполнен, даже если GL_RASTERIZER_DISCARD включен.

Что вам нужно сделать, чтобы обойти это, так это создать FBO с вложением цвета в 1 пиксель и привязать его. Вы должны иметь полную привязку FBO, иначе вы получите GL_INVALID_FRAMEBUFFER_OPERATION, и одно из правил полноты заключается в том, что должно быть прикреплено как минимум 1 полное изображение.

OpenGL 4.3 фактически позволяет вам обойти эту проблему, определяя FBO без каких-либо вложений (см.: GL_ARB_framebuffer_no_attachments). Однако, поскольку вы используете EXT-форму FBO и Transform Feedback, я сомневаюсь, что у вас есть реализация 4.3.

person Andon M. Coleman    schedule 09.06.2014
comment
Я понимаю. Спасибо. (Да, к сожалению, на данный момент я ограничен OpenGL 2.1 + некоторые расширения.) - person smokris; 09.06.2014