Рендеринг динамических карт куба в OpenGL с объектами кадрового буфера - PullRequest
2 голосов
/ 23 января 2011

Я пытаюсь динамически генерировать кубические карты в OpenGL, используя систему многопроходной визуализации. Метод, который я использую, успешно визуализирует сцену в объект буфера кадров (протестировано с glReadPixels). Буфер кадра прикрепляется к текстуре, целью которой является GL_TEXTURE_CUBE_MAP_ARB. Я проверил, что содержимое буфера кадра do попадает в текстуру, запросив связанную текстуру с помощью glGetTexImage и записав содержимое на диск.

Однако, когда я связываю карту куба, чтобы отобразить ее на объекте, текстура не отображается в сетке.

Процесс выглядит следующим образом:

1) Отсоединить все текстуры от GL_TEXTURE_CUBE_MAP_ARB

2) Привязать объект буфера кадра.

3) Присоединить текстуру к целевому GL_COLOR_ATTACHMENT0_EXT буфера кадра. Я начинаю с положительной-x стороны куба (GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB). Другие следуют в последующих проходах.

4) Присоединить буфер рендеринга глубины к целевому GL_DEPTH_ATTACHMENT_EXT буфера кадров.

5) Прямой рендеринг в GL_COLOR_ATTACHMENT0_EXT с glDrawBuffer.

6) Рендеринг сцены по соответствующей оси.

7) С еще ограниченным буфером кадров отсоедините текстуру с помощью glFramebufferTexture2DEXT.

8) Отсоедините буфер кадров и перенаправьте рендеринг в GL_BACK с помощью glDrawBuffer.

9) Повторите шаги 1-8 для всех сторон карты куба.

10) Свяжите окончательную текстуру карты куба и визуализируйте финальную сцену. Шейдер GLSL используется для вычисления координат текстуры.

Этот метод основан на доступных заметках здесь .

Шаги отладки, предпринятые до настоящего времени:

I) Загрузил статическую карту куба с диска для тестирования шейдера. Работает как положено.

II) Запрашивал содержимое буфера кадра, используя glReadPixels во время первых 6 проходов. Сцена появилась как надо.

III) Копирование содержимого карты куба с использованием glGetTexImage после завершения рендеринга. Написал содержимое на диск в виде файла образа. Различные стороны куба выглядели так, как должны.

Я могу только сделать вывод, что буфер / текстура кадра корректно отображаются. По какой-то причине я не могу заставить полученную текстуру появиться на финальной сетке. Текстура определенно привязана до последнего прохода рендеринга, и GL_TEXTURE_CUBE_MAP_ARB включен.

Как отмечено в процедуре, описанной выше, текстура не связана перед рендерингом кадрового буфера, чтобы избежать конфликтов чтения / записи. Точно так же текстура отсоединяется от буфера кадра после каждого прохода по той же причине.

Сначала я был обеспокоен тем, что мое повторное использование GL_COLOR_ATTACHMENT0_EXT вызвало проблему. Теперь это кажется маловероятным, учитывая шаг III моего процесса отладки. Более того, я нашел ссылки на интернет-форумах на людей, которые делают то же самое без проблем.

Это происходит на NVIDIA 9400M (Mac OS X). OpenGL Extension Viewer сообщает, что у меня есть все необходимые расширения для выполнения этой операции.

Любое понимание того, что может быть причиной этого, приветствуется.

1 Ответ

2 голосов
/ 23 января 2011

Удалось выдать свой ответ не через 6 минут. В мою защиту причина была немного странной.

В другом месте в программе я включил GL_GENERATE_MIPMAP_SGIS, расширение, отвечающее за генерацию мипмапов. Я не учел указывать LOD для mipmap при вызове glFramebufferTexture2DEXT.

Похоже, что эти две вещи вместе отключили текстуру в последнем проходе. Отключение GL_GENERATE_MIPMAP_SGIS во время рендеринга карты куба решает проблему.

Приветствие.

...