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