クローズド ソースの 3D アプリケーションである Maya 内で実行されるプラグインの一部として GLSL プログラムを作成しています。Maya は固定関数パイプラインを使用してライトを定義するため、プログラムはgl_LightSource
互換性プロファイルを使用してアレイからライト情報を取得する必要があります。私のライト評価は正常に動作しています(Nicol Bolas に感謝) 1 つのことを除いて、アレイ内の特定のライトが有効か無効かを判断する方法がわかりません。これが私がこれまでに持っているものです:
#version 410 compatibility
vec3 incidentLight (in gl_LightSourceParameters light, in vec3 position)
{
if (light.position.w == 0) {
return normalize (-light.position.xyz);
} else {
vec3 offset = position - light.position.xyz;
float distance = length (offset);
vec3 direction = normalize (offset);
float intensity;
if (light.spotCutoff <= 90.) {
float spotCos = dot (direction, normalize (light.spotDirection));
intensity = pow (spotCos, light.spotExponent) *
step (light.spotCosCutoff, spotCos);
} else {
intensity = 1.;
}
intensity /= light.constantAttenuation +
light.linearAttenuation * distance +
light.quadraticAttenuation * distance * distance;
return intensity * direction;
}
}
void main ()
{
for (int i = 0; i < gl_MaxLights; ++i) {
if (/* ??? gl_LightSource[i] is enabled ??? */ 1) {
vec3 incident = incidentLight (gl_LightSource[i], position);
<snip>
}
}
<snip>
}
Maya が新しいライトを有効にすると、プログラムは期待どおりに動作しますが、Maya が以前に有効にしたライトをおそらく を使用して無効にすると、そのパラメータは配列glDisable (GL_LIGHTi)
内でリセットされず、明らかに変更されないため、プログラムはシェーディング計算でその古いライト情報を使用し続けます。 . 上には示していませんが、たとえば などの明るい色は、無効にした後もゼロ以外の古い値を保持し続けます。gl_LightSource
gl_MaxLights
gl_LightSource[i].diffuse
Maya は固定機能のパイプライン (GLSL なし) を使用して他のすべてのジオメトリを描画し、これらのオブジェクトは無効なライトを正しく無視します。GLSL でこの動作を模倣するにはどうすればよいですか?