2009-06-03 3 views
3

Есть ли способ узнать, включен ли свет в GLSL, который не включает передачу атрибутов или создание тонны разных шейдеров?Почему я не могу узнать состояние огней OpenGL в GLSL?

А как насчет использования Cid для NVidia? Могу ли я сделать это с помощью Cg?

Теперь я убежден, что вы не можете этого сделать. Но теперь я спрашиваю: почему бы и нет?

+0

Я надеюсь, вы не имеете в виду старые стационарные огни трубопровода ... (старый вопрос, хотя я понимаю) – thecoshman

ответ

6

Согласно моему пониманию «Включить или не разрешать» часть GLSL Common Mistakes, это философское Причина: шейдеры записываются для переопределения фиксированного конвейера, поэтому они не должны полагаться на фиксированные состояния конвейера. Вы должны использовать другой шейдер для каждого c вам нужно.

Кроме того, я предполагаю, что это может быть выбор дизайн, основанный на том, что ветви стоят дорого на GPU и кто-то должен подумать, что вы не должны делать такие вещи, как

if (gl_LightSource[0].enabled) 
{ ... } 

в первую очередь.

1

Если GLSL что-то похожее на HLSL (эквивалент DirectX), который, как я подозреваю, я думаю, вы застряли в передаче атрибутов.

:-(

3

unforgiven3 прав - GLSL не обеспечивает доступа к неподвижной трубе позволит государствам Вы должны передать его в качестве униформы

+0

Есть ли причина для этого? –

+0

Не знаю точно, но, вероятно, было бы слишком дорого поддерживать аппаратную точку зрения. –

0

Вы можете установить цвет света к (.. 0,0,0,0) и либо на нее, либо просто пропустите ее, не включив свет.

+0

Приятный трюк. Это может сработать, но оно кажется неуклюжим (установка света вкл./Выкл. Намного чище, чем сохранение/восстановление его цвета). Я как бы отказался от первоначального вопроса. Вы не можете этого сделать. Теперь меня больше интересует «почему бы и нет»? –