Как я могу отладить то, что отображается в объекте буфера кадра в OpenGL?

17

У меня есть облако точек, которое отображается на экране. Каждая точка имеет свою позицию и цвет, а также идентификатор.

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

Как только рендеринг в FBO закончен, я читаю пиксели цветовой текстуры, glReadPixels()чтобы увидеть, каковы значения, но они, кажется, все очищены, т. Е. Значение, которое они имеют, совпадает с glClearColor().

Есть ли способ, которым я могу отладить то, что отображается на цветовой текстуре моего FBO? Любые советы, которые вы можете дать, очень приветствуются.

BRabbit27
источник

Ответы:

21

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

Очень хорошим является Renderdoc, который является абсолютно бесплатным и с открытым исходным кодом. Также это активно поддерживается.

Другой - Intel GPA, который, к сожалению, согласно его веб-странице, поддерживает до OGL 3.3 Core.

Просто для того, чтобы добавить еще один, я использовал gDEBugger , но это прошло давно с момента последнего обновления. Это превратилось в AMD CodeXL, который, к сожалению, я никогда не использовал.

cifz
источник
Кроме того, у меня также иногда есть команда, которая выдает указанную fbo в образ при нажатии клавиши. Это низкотехнологичный способ.
Хорхе Родригес
Также, вероятно, хорошей идеей будет убедиться, что у вас есть правильная настройка теста глубины, для рендеринга, входящего в ваше FBO визуализации.
ry
Я все еще время от времени использую gDEbugger для старых версий GL. CodeXL - это более современная версия, которую можно найти здесь: github.com/GPUOpen-Tools/CodeXL. Обратите внимание, что на странице apitrace
Bim
11

Я протестировал несколько приложений / API / библиотек для получения данных от FBO в приложениях, которые, например, используют gbuffer. После нескольких месяцев страданий я обнаружил apitrace, доступный на Github для отладки OpenGL, Direct3D и WebGL. Я использовал в Windows и Linux без проблем.

Я надеюсь, что это может быть полезно для вас.

esmitt
источник
7

В дополнение к ответу cifz, другой способ визуализации FBO, который не требует больших затрат кода, заключается в использовании glBlitFramebuffer () для переноса пикселей из кадрового буфера в окно.

// XXX WARNING: Untested code follows

// Blit from fbo...
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
// ...to the front buffer.
glBindFramebuffer(GL_WRITE_FRAMEBUFFER, GL_FRONT);

GLsizei HalfWindowWidth = (GLsizei)(WindowWidth / 2.0f);
GLsizei HalfWindowHeight = (GLsizei)(WindowHeight / 2.0f);

// Blit attachment 0 to the lower-left quadrant of the window
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBlitFramebuffer(0, 0, FboWidth, FboHeight,
                  0, 0, HalfWindowWidth, HalfWindowHeight,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);

// Blit attachment 1 to the lower-right quadrant of the window
glReadBuffer(GL_COLOR_ATTACHMENT1);
glBlitFramebuffer(0, 0, FboWidth, FboHeight,
                  HalfWindowWidth, 0, WindowWidth, HalfWindowHeight,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);

// ...and so on. You can switch FBOs if you have more than one to read from.

Есть несколько очевидных «уловок», в которых буферы HDR, вероятно, не будут визуализировать так, как вы ожидаете, вы, вероятно, не сможете «увидеть» буферы глубины / трафарета очевидным образом, и если размер FBO не не совпадает с областью, к которой прикрыты, метод увеличения / минимизации может быть чрезвычайно наивным.

Но как быстро и грязные хаки, это довольно хорошо.

Псевдоним
источник