Неинициализированная / незащищенная память GPU в текстурах, OpenGL

#opengl #textures #fbo #deferred-rendering

#opengl #Текстуры #fbo #отложенный рендеринг

Вопрос:

(На самом деле это кросспостинг от gamedev, но я подумал, что вы, ребята и девушки, тоже можете быть полезны!)

Редактировать: я подробно рассказал о том, что я имею в виду под overlay. После некоторого сна я обнаружил, что мой вызов glGenerateMipmaps бесполезен, поскольку я использую null в качестве указателя на glTexImage2D.

На OpenGL 3.3, Ubuntu 11.04, драйверах nVidia 280.13, GeForce GT240.

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

При рендеринге (по одному) G-буферов (текстур FBO) в полном окне они отображаются правильно. При рендеринге этих наложений я получаю мусор (кажущаяся случайной память GPU в виде статических помех, но различается между запусками, иногда четкое изображение).

Если я создаю другую текстуру, скажем, из файла, она отображается без мусора в наложениях, так что код должен быть в порядке. Кто-нибудь может объяснить, почему? Я использовал glGenerateMipmap для текстур в G-буфере.

Я знаю, что этого может быть недостаточно, но начинается с этого. Пожалуйста, спросите о любой соответствующей информации. Может ли проблема быть связана с FBO-рендерингом и mipmapping? Конечно, мой код хочет показать незащищенную / неинициализированную память, но я не знаю почему. В четырех текстурах, приведенных ниже, содержатся ненужные данные.


Зеленое изображение во все окна — это мой текущий результат с этапа освещения в разрешении (256 * 256) для экономии памяти GPU из-за большого G-буфера. Кроме того, в шейдере материала (генерирующем G-буфер) я использую «out vec4 fragment [3]», а текстуры имеют разные внутренние форматы. Может ли это быть проблемой?

PS. Индикаторы находятся на (-30,0,0) и (30,0,0), но, похоже, «ближе». Может ли это быть проблемой точности? Я использую GL_RGBA16F для нормалей, GL_RGBA32F для позиций, GL_DEPTH_COMPONENT24 для глубины и GL_RGBA для альбедо (да, огромная трата, но я оптимизирую позже).

Комментарии:

1. «При рендеринге на небольшие оверлеи я получаю мусор»: что такое «маленькие оверлеи»?

2. Учитывая полное отсутствие кода, это может быть что угодно.

Ответ №1:

Хорошо, я нашел проблему. Я сгенерировал mipmaps до того, как в памяти появились какие-либо значимые данные. Отключение mipmapping для соответствующих текстур решило проблему. В любом случае спасибо за ваше внимание! введите описание изображения здесь