Почему я не могу узнать состояние индикаторов OpenGL в GLSL?
Вопрос
Есть ли способ узнать, включен ли свет в GLSL, без передачи атрибутов или создания множества различных шейдеров?
А как насчет использования NVidia C для графики (Cg)?Могу ли я сделать это с помощью Cg?
Теперь я убежден, что ты не сможешь этого сделать.Но теперь я спрашиваю:почему нет?
Решение
Согласно моему пониманию части «Включить или не включить» Распространенные ошибки GLSL это философская причина:шейдеры написаны для переопределения фиксированного конвейера, поэтому они не должны полагаться на фиксированные состояния конвейера.Вам придется использовать разные шейдеры для каждой необходимой вам возможности.
Также я предполагаю, что это может быть выбор дизайна, основанный на том факте, что ветки требуют больших затрат ресурсов графического процессора, и кто-то, должно быть, подумал, что вам не следует делать такие вещи, как
if (gl_LightSource[0].enabled)
{ ... }
в первую очередь.
Другие советы
unforgiven3 прав: GLSL не предоставляет доступ к состояниям включения фиксированного канала.Вы должны сдать его как униформу.
Если GLSL чем-то похож на HLSL (эквивалент DirectX), что, как я подозреваю, так и есть, то, думаю, вы застряли в передаче атрибутов.
:-(
Вы можете установить цвет света на (0,0,0,0) и либо разветвиться на него, либо просто позволить ему зацикливаться на уже не вносящих вклад источниках света.