Diffuse Light berechnen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Elmi
Beiträge: 12
Registriert: 13.06.2023, 07:30

Diffuse Light berechnen

Beitrag von Elmi »

Hi,

nach dem ich meine Normals-Probleme gelöst habe, bekomme ich jetzt eine recht ansehnliche Darstellung. Runde Modelle zeigen einen deutlichen Lichtreflex vom Specular Light. Allerdings sehen größere gerade Flächen noch ein wenig matschig aus, vermutlich weil ich bisher noch keinerlei Diffuse Light berechne.

Das ist aktuell mein Shader mit fester Richtung und Stärke des Specular Light und mit einem Ambient Light das einfach per "+0.05" in der letzten Zeile erzeugt wird:

Code: Alles auswählen

#version 130
uniform vec4 inputColor;\n"
in vec3 Normal;\n"
in vec3 fPos;\n"
out vec4 FragColor;\n"
const vec3 lightPos = vec3(0.0,0.0,5.0);
const vec3 specColor = vec3(0.7,0.7,0.7);
void main()
{
   vec3 normal = normalize(Normal);
   vec3 viewDir = normalize(-fPos);
   if (dot(normal,viewDir)<0.0) normal*=-1.0;
   vec3 lightDir = normalize(lightPos - fPos);
   float lamb = max(dot(lightDir, normal), 0.0);
   float spec = 0.0;
   if (lamb > 0.0)
   {
       vec3 refDir = reflect(-lightDir, normal);
       float specAngle = max(dot(refDir, viewDir), 0.0);
       spec = pow(specAngle, 4.0);
   }
   FragColor=inputColor+vec4(spec*specColor,0.0)+0.05;
}
Meine Frage: wie bekomme ich da jetzt ein schönes Diffuse Light rein (sinnvollerweise vermutlich mit einer anderen Richtung als das Specular Light)?

Danke!
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Diffuse Light berechnen

Beitrag von Zudomon »

Du brauchst: Materialfarbe * (Lichteinfall * Lichtintensität + Ambient) + Specular.
Es sieht so aus, als ob inputColor deine Materialfarbe ist. Eigentlich kommt der Wert aus einer Textur. Wobei da dann zu beachten gilt, dass man das Licht Linear multipliziert und daher vorher Gamma rausrechnen und hinterher wieder reinrechnen muss. Musst du eigentlich bei der Materialfarbe auch beachten. Aber das ist auch alles hinterher nur, um es noch exakter zu machen, also im Hinterkopf behalten, für den Anfang geht es erstmal so... 😀
"Lamb" scheint bei dir schon den Lichteinfall zu berechnen, das brauchst du nur noch mit rein nehmen. Und ja, die Richtung ist hier eine andere, weil für dein Specular berechnest du im Shader ja die Reflektion. Wichtig ist, dass dein Ambienter Teil (+0.05) mit in den Lichtanteil fließt und nicht einfach nur hinzu addiert wird. Anschließend den Lichtanteil mit der Materialfarbe multiplizieren.
Also sowas wie: FragColor = inputColor * (lamb * vec4(lightColor, 0.0) + 0.05) + vec4(spec * specularColor, 0.0);
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Diffuse Light berechnen

Beitrag von Krishty »

Zudomon hat geschrieben: 06.07.2023, 19:28Wobei da dann zu beachten gilt, dass man das Licht Linear multipliziert und daher vorher Gamma rausrechnen und hinterher wieder reinrechnen muss. Musst du eigentlich bei der Materialfarbe auch beachten. Aber das ist auch alles hinterher nur, um es noch exakter zu machen, also im Hinterkopf behalten, für den Anfang geht es erstmal so... 😀
Und direkt im Hinterkopf behalten, dass man das normalerweise die GPU für sich erledigen lässt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten