Доступ к 32-битному буферу глубины из фрагментного шейдера? - PullRequest
0 голосов
/ 14 октября 2010

Я пытаюсь сделать следующую технику для теневого копирования, я прочитал ее на сайте NVIDIA, и это показалось мне хорошей техникой.Я бы предпочел, чтобы он вычислял теневые объемы на процессоре, потому что он кажется более «верным», и я мог бы использовать его для мягкого теневого копирования.:

1-й проход:

  • Заполнить буфер глубины с точки зрения LIGHT0.Скопируйте этот буфер глубины для второго прохода.(*)

2-й проход:

  • Визуализация вида из EYE и для каждого фрагмента:
    • Получение местоположения XY в буфере глубины, хранящемся в(*).Получите соответствующее 32-битное значение.
    • Рассчитайте расстояние до источника света.
    • Сопоставьте это расстояние с сохраненным значением буфера глубины.
    • Если оно больше, фрагмент отображается в режиме glDisable (LIGHT0), в противном случае он рисуется с включенным освещением.Для этой цели я использую два фрагментных шейдера и фрагменты, которые смешиваются / переключаются между ними в соответствии со сравнением расстояния.

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

Но яЯ новичок в openGL, и я не понимаю, как сделать что-либо из следующего:

  • Как получить доступ к буферу глубины 1-го прохода в фрагментном шейдере, не копируя его в 2d-текстуру. Я предполагаю, чтоневозможно?
  • Если копирование 32-битного буфера глубины в текстуру, имеющую 8 бит в каждом компоненте R, G, B, A, а затем повторную сборку этого значения в фрагментном шейдере является наиболееэффективная вещь, которую я могу сделать?
  • Если есть кроссплатформенные расширения, которые я мог бы использовать для этого.

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

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

Первый способ - использовать FBO с текстурой GL_DEPTH_COMPONENT, прикрепленной к вложению GL_DEPTH_ATTACHMENT.

Второй способ - снова использовать glCopyTexImage2D с текстурой GL_DEPTH_COMPONENT.

FBO являются кроссплатформенными и доступны практически во всех современных реализациях OpenGL, вы должны иметь их в своем распоряжении.

0 голосов
/ 14 октября 2010

Вы правы: вам нужно создать 2D-текстуру из значений буфера глубины, чтобы использовать эти значения во 2-м проходе.

Что касается самой текстуры, я думаю, что при копировании из буфера глубины 32 бита в 8-битный RGBA не будет использоваться cast для преобразования данных: для среднего значения буфера глубины (скажем, 0x80000000) вы получит полутона на R, G, B и A на вашей текстуре rgba:

RGBA[0] = 0x80;
RGBA[1] = 0x80;
RGBA[2] = 0x80;
RGBA[3] = 0x80;

Где бы вы ожидали: (приведение)

RGBA[0] = 0x80;
RGBA[1] = 0;
RGBA[2] = 0;
RGBA[3] = 0;

Итак, для правильного формата я не уверен, но я бы посоветовал вам не изменять его во время копирования, поскольку вы не хотите, чтобы на конвертацию накладных расходов.

...