6

私は独自の(opengl組み込みではない)ライトを使用しています。これは私のフラグメントシェーダープログラムです:

#version 330

in vec4 vertexPosition;
in vec3 surfaceNormal;
in vec2 textureCoordinate;
in vec3 eyeVecNormal;

out vec4 outputColor;

uniform sampler2D texture_diffuse;
uniform bool specular;
uniform float shininess;

struct Light {
    vec4 position;
    vec4 ambientColor;
    vec4 diffuseColor;
    vec4 specularColor;
};

uniform Light lights[8];

void main()
{
    outputColor = texture2D(texture_diffuse, textureCoordinate);
    for (int l = 0; l < 8; l++) {
        vec3 lightDirection = normalize(lights[l].position.xyz - vertexPosition.xyz);
        float diffuseLightIntensity = max(0, dot(surfaceNormal, lightDirection));

        outputColor.rgb += lights[l].ambientColor.rgb * lights[l].ambientColor.a;
        outputColor.rgb += lights[l].diffuseColor.rgb * lights[l].diffuseColor.a * diffuseLightIntensity;
        if (specular) {
            vec3 reflectionDirection = normalize(reflect(lightDirection, surfaceNormal));
            float specular = max(0.0, dot(eyeVecNormal, reflectionDirection));
            if (diffuseLightIntensity != 0) {
                vec3 specularColorOut = pow(specular, shininess) * lights[l].specularColor.rgb;
                outputColor.rgb += specularColorOut * lights[l].specularColor.a;
            }
        }
    }
}

ここでの問題は、アンビエント カラーと言う 2 つの光源がある場合vec4(0.2f, 0.2f, 0.2f, 1.0f)、モデルのアンビエント カラーは、vec4(0.4f, 0.4f, 0.4f, 1.0f)それを outputColor 変数に追加するだけであるということです。複数のライトに対して単一のアンビエント カラー変数と単一のディフューズ カラー変数を計算するにはどうすればよいでしょうか。現実的な結果が得られますか?

4

1 に答える 1

12

興味深い事実があります。現実世界のライトには、アンビエント カラー、ディフューズ カラー、スペキュラー カラーはありません。それらは1 つの色を発します。期間 (わかりました、技術的に言いたいのであれば、光は多くの色を発します。ただし、個々の光子には「周囲」の特性はありません。波長が異なるだけです)。あなたがしているのは、周囲光と拡散光の色に関する OpenGL のナンセンスをコピーした誰かをコピーすることだけです。

他人のコードをコピーするのをやめて、正しく実行してください

それぞれの光には色があります。その色を使用して、オブジェクトに対するその光の拡散および鏡面反射の影響を計算します。それでおしまい。

アンビエントはシーンのプロパティであり、特定のライトのプロパティではありません。これは、間接的なグローバル イルミネーションを表すことを目的としています。つまり、シーン内の他のオブジェクトから反射された光を、一般的な集合体として捉えます。アンビエント「ライト」はありません。アンビエント項は 1 つだけで、1 回適用する必要があります。

于 2013-03-20T23:07:15.720 に答える