OpenGL трафаретный буфер ИЛИ операция? - PullRequest
7 голосов
/ 23 сентября 2010

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

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

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

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

Я не использовал трафаретный буфер раньше, но из того, что я читаю, это кажется невозможным.Чтобы это работало, я должен был установить буфер трафарета с помощью побитового ИЛИ, а функция трафарета должна быть побитового И.Тем не менее, единственные операции над буфером трафарета, которые я вижу, это: KEEP, ZERO, REPLACE, INCR, DECR и INVERT, и единственными функциями являются: НИКОГДА, ВСЕГДА, МЕНЬШЕ, РАВНО, ЛЕКАЛЬНО, GEQUAL, GREATER и NOTEQUAL.

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

1 Ответ

6 голосов
/ 25 сентября 2010

Чтобы получить поведение обновления ORing, используйте glStencilMask в сочетании с GL_REPLACE. Чтобы получить тестовое поведение ANDing, используйте параметр glStencilFunc mask в сочетании с GL_EQUAL. В обоих случаях вам нужно, чтобы параметр ref равнялся glStencilFunc, равному 0xff.

...