Буфер трафарета OpenGL ИЛИ операция?

Я не уверен, возможно ли это, но стоит попробовать. Я' m с использованием буфера трафарета для уменьшения перерисовки светлых объемов в отложенном рендерере с использованием этого алгоритма (когда камера находится за пределами объема):

  1. Используя дешевый шейдер, отрисуйте грани с проверкой глубины, установленной на LEQUAL, пометив их в буфер трафарета.
  2. Используя дорогостоящий шейдер освещения, нарисуйте передние грани с установкой проверки глубины на GEQUAL.

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

Решение, которое приходит на ум, - использовать 1 бит в буфере трафарета для каждого источника света. Итак, для света n отметьте n -й бит в буфере трафарета на дешевом проходе, а затем визуализируйте пиксели с этим битом только во время дорогостоящего прохода.

Я не знаю. Я раньше не использовал буфер трафарета, но из того, что я читаю, это кажется невозможным. Чтобы это сработало, мне пришлось бы установить буфер трафарета с помощью побитового ИЛИ, а функция трафарета должна была быть побитовым И. Однако единственные операции с буфером трафарета, которые я вижу: KEEP, ZERO, REPLACE, INCR, DECR и INVERT, и единственные функции: NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GEQUAL, GREATER и NOTEQUAL.

Есть ли способ каким-то образом добиться этого поведения ИЛИ и И с помощью буфера трафарета? А если нет, есть ли альтернативный подход к эффективному рендерингу световых объемов?

7
задан Gumgo 23 September 2010 в 09:27
поделиться