Pourquoi ne puis-je connaître l'état d'OpenGL lumières en GLSL?
Question
Y at-il un moyen de savoir si une lumière est activée en GLSL qui ne comporte pas d'attributs qui passe ou la création d'une tonne de différents shaders?
Qu'en est-il en utilisant le C pour Graphics NVidia (Cg)? Puis-je le faire avec Seizième?
Je suis maintenant convaincu que vous ne pouvez pas le faire. Mais maintenant je demande: pourquoi pas?
La solution
Selon ma compréhension de « Activer ou non activer » une partie de GLSL erreurs courantes c'est une raison philosophique: Les shaders sont écrits pour passer outre pipeline fixe, par conséquent, ils ne doivent pas compter sur les états de pipelines fixes. Tu dois utiliser un shader différent pour chaque capacité dont vous avez besoin.
Je suppose que cela pourrait aussi être un choix de conception basée sur le fait que les branches sont chères sur le GPU et quelqu'un a dû penser que vous ne devriez pas faire des choses comme
if (gl_LightSource[0].enabled)
{ ... }
en premier lieu.
Autres conseils
unforgiven3 est juste - GLSL ne donne pas accès au tuyau fixe permettant aux Etats. Vous devez passer dans un uniforme.
Si GLSL est quelque chose comme HLSL (l'équivalent de DirectX), que je soupçonne qu'il est, je pense que vous êtes coincé avec des attributs de passage.
: - (
Vous pouvez définir la couleur de la lumière à (0,0,0,0) et une branche à ce sujet, ou tout simplement laisser une boucle sur les lumières maintenant non contributifs.