2 Stimmen

Wie transformiert man in modernem GLSL ein gerichtetes Licht in Bildschirmkoordinaten?

Ich stelle meine Shader um und verlasse mich nicht mehr auf die OpenGL-Pipeline mit den festen Funktionen. Zuvor, OpenGL automatisch transformiert die Lichter für mich, aber jetzt muss ich es selbst tun.

Ich habe den folgenden GLSL-Code in meinem Vertex-Shader:

//compute all of the light vectors. we want normalized vectors 
//from the vertex towards the light
for(int i=0;i < NUM_LIGHTS; i++)
{
    //if w is 0, it's a directional light, it is a vector 
    //pointing from the world towards the light source
    if(u_lightPos[i].w == 0)
    {
        vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));
        v_lightDir[i] = transformedLight;
    }
    else
    {
        //this is a positional light, transform it by the view*projection matrix
        vec4 transformedLight = u_vp_matrix * u_lightPos[i];

        //subtract the vertex from the light to get a vector from the vertex to the light
        v_lightDir[i] = normalize(vec3(transformedLight - gl_Position));
    }
}

Wodurch ersetze ich das ??? in der Zeile vec3 transformedLight = normalize(vec3(??? * u_lightPos[i])); ?

Ich habe bereits die folgenden Matrizen als Eingaben:

uniform mat4 u_mvp_matrix;//model matrix*view matrix*projection matrix
uniform mat4 u_vp_matrix;//view matrix*projection matrix
uniform mat3 u_normal_matrix;//normal matrix for this model

Ich glaube nicht, dass es an einem von ihnen liegt. Es ist offensichtlich nicht die mvp-Matrix oder die normale Matrix, weil diese spezifisch für das aktuelle Modell sind, und ich versuche, in Ansichtskoordinaten zu konvertieren. Ich glaube nicht, es ist die vp-Matrix auch nicht, weil das Übersetzungen und ich will nicht, einen Vektor zu übersetzen.

Kann ich die Matrix, die ich benötige, aus dem berechnen, was derzeit an den Shader übergeben wird, und wenn ja, was muss ich berechnen? Wenn nicht, welche Matrix muss ich hinzufügen und wie sollte sie berechnet werden?

4voto

Paul-Jan Punkte 16398

Sie können die gleiche view_projection-Matrix verwenden. Ja, diese Matrix hace eine Verschiebung beinhalten, aber da der Lichtvektor w = 0 hat, wird die Matrixmultiplikation diese nicht anwenden.

4voto

Nicol Bolas Punkte 409659

Sie sollen die Position/Richtung des Lichts in den Sichtbereich auf der CPU und nicht in einem Shader. Es handelt sich um eine Uniform; sie wird einmal pro Frame und Licht durchgeführt. Es ändert sich nicht, also gibt es keine Notwendigkeit, eine jede vertex berechnen. Das ist Zeitverschwendung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X