Ich benutze mein eigenes (nicht OpenGL eingebaut) Licht. Das ist mein Fragment-Shader-Programm:GLSL Berechnung Farbvektor von mehreren Lichter
#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;
}
}
}
}
Das Problem ist jetzt, dass, wenn ich zwei Lichtquellen mit sagen Umgebungsfarbe vec4(0.2f, 0.2f, 0.2f, 1.0f)
die Umgebungsfarbe auf Modell vec4(0.4f, 0.4f, 0.4f, 1.0f)
sein wird, weil ich es einfach auf die Variable outputColor hinzuzufügen. Wie kann ich eine einzelne Umgebung und eine einzelne diffuse Farbvariable für mehrere Lichter berechnen, so würde ich ein realistisches Ergebnis bekommen?
Ambient ist sowieso ein Hack, der für reflektiertes Licht steht ... also kannst du ziemlich genau das machen, was du willst - Warum nicht einfach Ambient zu einer Eigenschaft deiner Szene machen, anstatt per Licht? – JasonD
Wahrscheinlich möchten Sie die Intensität des Lichts aufgrund seiner Entfernung vom Fragment abschwächen. Sehen Sie sich die Formeln an, die die Pipeline mit fester Funktion verwendet. –