1

クローズド ソースの 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_LightSourcegl_MaxLightsgl_LightSource[i].diffuse

Maya は固定機能のパイプライン (GLSL なし) を使用して他のすべてのジオメトリを描画し、これらのオブジェクトは無効なライトを正しく無視します。GLSL でこの動作を模倣するにはどうすればよいですか?

4

2 に答える 2

1

残念ながら、GLSL 仕様を見ましたが、この情報を提供するものは何もありません。同じ結論に達したと思われる別のスレッドも見ました。

プラグインでライトの値を変更したり、有効/無効フラグとして使用できるユニフォームを追加したりする方法はありますか?

于 2012-07-06T18:18:33.093 に答える