2009-06-03 10 views
3

Y at-il un moyen de savoir si une lumière est activée dans GLSL qui n'implique pas de passer des attributs ou de créer une tonne de shaders différents? Qu'en est-il de l'utilisation de NVidia C for Graphics (Cg)?Pourquoi ne puis-je pas connaître l'état des voyants OpenGL dans GLSL?

Puis-je le faire avec Cg?

Je suis maintenant convaincu que vous ne pouvez pas le faire. Mais maintenant je demande: pourquoi pas?

+0

Je crois que vous ne voulez pas dire les vieilles lumières de pipeline fixes ... (vieille question si je me rends compte) – thecoshman

Répondre

6

Selon ma compréhension de la partie «Activer ou ne pas activer» de GLSL Common Mistakes, il s'agit d'une approche philosophique. Raison: les shaders sont écrits pour remplacer le pipeline fixe, ils ne doivent donc pas dépendre des états de pipeline fixes Vous devez utiliser un shader différent pour chaque c apabilité dont vous avez besoin.

Je suppose aussi que cela pourrait ê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.

1

Si GLSL est quelque chose comme HLSL (l'équivalent de DirectX), ce que je pense que c'est, je pense que vous êtes bloqué avec des attributs de passage.

:-(

3

unforgiven3 est juste - GLSL ne vous avez donne pas accès au tuyau fixe permettant aux Etats de passer dans un uniforme

+0

Y at-il une raison pour cela? –

+0

Ne sais pas avec certitude, mais il aurait probablement été trop cher à supporter du point de vue matériel. –

0

Vous pouvez définir la couleur de la lumière à (.. 0,0,0,0) et soit faire une boucle sur les lumières qui ne contribuent pas,

+0

Bon tour. Cela peut fonctionner, mais il semble maladroit (allumer/éteindre la lumière est tellement plus propre que d'enregistrer/restaurer sa couleur). J'ai un peu abandonné la question initiale. Tu ne peux pas le faire. Maintenant, je suis plus intéressé par "pourquoi pas?" –