2013-03-20 4 views
6

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?

+8

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

+0

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

Antwort

12

Hier ist eine lustige Tatsache: Lichter in der realen Welt haben keine umgebende, diffuse oder spiegelnde Farben. Sie geben eine Farbe aus. Zeitraum (OK, wenn Sie technisch sein wollen, emittieren Lichter Lose von Farben. Aber einzelne Photonen haben keine "Umgebungs" -Eigenschaften. Sie haben nur unterschiedliche Wellenlängen). Sie kopieren nur jemanden, der den OpenGL-Unsinn über Umgebungslicht und diffuse Lichtfarben kopiert hat.

Stoppen Sie den Code von jemand anderem zu kopieren und tun Sie es rechts.

Jedes Licht hat eine Farbe. Sie verwenden diese Farbe, um die diffusen und spiegelnden Beiträge dieses Lichts zum Objekt zu berechnen. Das ist es.

Ambient ist eine Eigenschaft der Szene, nicht von einem bestimmten Licht. Es soll indirect, global illumination darstellen: das Licht, das von anderen Objekten in der Szene reflektiert wird, als ein allgemeines Aggregat. Sie haben keine Umgebungslichter; Es gibt nur einen Umgebungsausdruck, der einmal angewendet werden sollte.

+2

: DD Ich mag deine Antworten! – Qualphey