Uso la mia luce (non integrata). Questo è il mio frammento di programma di shader:GLSL calcolo del vettore a colori da più luci
#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;
}
}
}
}
Ora il problema è che quando ho 2 fonti di luce con dirlo Colore ambiente vec4(0.2f, 0.2f, 0.2f, 1.0f)
il colore ambiente sul modello sarà vec4(0.4f, 0.4f, 0.4f, 1.0f)
perché semplicemente aggiungerlo alla variabile outputColor. Come posso calcolare una singola ambient e una singola variabile di colore diffusa per più luci, quindi otterrei un risultato realistico?
Ambient è un hack in ogni caso, in piedi per la luce riflessa ... così puoi praticamente fare quello che vuoi - Perché non solo rendere l'ambiente una proprietà della scena piuttosto che una luce? – JasonD
Probabilmente si vuole attenuare l'intensità della luce, data la sua distanza dal frammento. Dai un'occhiata alle formule che usa la pipeline della funzione fissa. –