Визуализация динамических кубических карт в OpenGL с объектами кадрового буфера

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

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

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

1) Отвязать все текстуры от GL_TEXTURE_CUBE_MAP_ARB

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

3) Присоедините текстуру к целевому GL_COLOR_ATTACHMENT0_EXT буфера кадра. Я начинаю с положительной стороны куба (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 сообщает, что у меня есть все необходимые расширения для выполнения этой операции.

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


person gxcode    schedule 23.01.2011    source источник


Ответы (1)


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

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

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

Ваше здоровье.

person gxcode    schedule 23.01.2011