2013-03-20 11 views
6

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?

+8

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

+0

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. –

risposta

12

Ecco un fatto divertente: le luci nel mondo reale non hanno colori ambientali, diffusi o speculari. Emettono un colore. Periodo (OK, se si vuole essere tecnici, le luci emettono lotti di colori, ma i singoli fotoni non hanno proprietà "ambientali". Tutto quello che stai facendo è copiare qualcuno che ha copiato le assurdità di OpenGL riguardo ai colori chiari dell'ambiente e diffusi.

Interruzione copia qualcun altro codice e farlo giusto.

Ogni luce ha un colore. Usi quel colore per calcolare i contributi diffusi e speculari di quella luce all'oggetto. Questo è tutto.

Ambiente è una proprietà della scena , non di una luce particolare. Si intende rappresentare indirect, global illumination: la luce riflessa da altri oggetti nella scena, presa come un aggregato generale. Non hai "luci" ambientali; c'è solo un termine ambiente e dovrebbe essere applicato una volta.

+2

: DD Mi piacciono le tue risposte! – Qualphey