void main() { vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; pos.x /= pos.z; pos.z = sqrt(pos.z); pos.xz *= pos.y; // y und z werden später in den Matrizen vertauscht; Projektion soll rückgängig gemacht werden;
gl_Position = LightProjectionMatrix * pos; //geht nicht position = vec3(LightModelViewMatrix * gl_Vertex); //geht wahrscheinlich normal = normalize(LightNormalMatrix * gl_Normal); //geht nicht gl_FrontColor = gl_Color; }
Auf der Shadowmap soll nur das zu sehen sein, was grundsätzlich Schatten auf sichtbare Objekte werfen kann. Und zwar weiter hinten weniger detailreich, daher sqrt.
Code:
pos.xz *= pos.y;
Das ganze wird unter gluPerspective gezeichnet. Benötigt wird aber glOrtho. Daher muss die Projektion (division durch z) "rückgängig" gemacht werden. Das y wird bei der multiplikation mit der LightProjectionMatrix mit z vertauscht.
Code:
position = vec3(LightModelViewMatrix * gl_Vertex); //geht wahrscheinlich normal = normalize(LightNormalMatrix * gl_Normal); //geht nicht gl_FrontColor = gl_Color;
wird bei einer ShadowMap zwar nicht gebraucht, aber ich will mir die shadowMap mal anschauen, und so ists übersichtlicher (das heißt, wenns funktionieren würde) Als Fragmentshader benutz ich den Phong Per Pixel 2.
Berechnung der Uniform variablen:
Code:
var NormalM: TAffineMatrix; MVMat: TMatrix; CameraMat: TMatrix; CameraAffMat: TAffineMatrix; X, Y, Z: TVector; i1, i2: Integer; begin if RenderMode = rm_Shadow_Map then begin Z:= Terra.Lights[0][L_Pos]; //Z soll in Lichtrichtung zeigen Z[3]:= 0; NormalizeVector( Z ); NormalM:= IdentityMatrix; // NormalM:= Rotationsmatrix der Kamera NormalM:= MatrixMultiply( CreateAffineRotationMatrix(AffineVectorMake(1, 0, 0), Camera.Rotation[0]), NormalM ); NormalM:= MatrixMultiply( CreateAffineRotationMatrix(AffineVectorMake(0, 1, 0), Camera.Rotation[1]), NormalM ); NormalM:= MatrixMultiply( CreateAffineRotationMatrix(AffineVectorMake(0, 0, 1), Camera.Rotation[2]), NormalM ); // normale RotationsMatrix machen; X:= VectorMake(NormalM[0, 0], NormalM[1, 0], NormalM[2, 0], 0); SubtractVector(X, VectorScale( Z, VectorDotProduct(X, Z) ) ); // X soll normal auf Z sein; X -= Z*(Z dot X); length(Z) = 1, daher ist die division überflüssig NormalizeVector( X ); Y:= VectorCrossProduct( Z, X ); NormalizeVector(Y); //überflüssig?
for i1:= 0 to 3 do for i2:= 0 to 3 do if (i1 < 3) and (i2 < 3) then CameraMat[i1, i2]:= NormalM[i1, i2] else if (i1 < 3) xor (i2 < 3) then CameraMat[i1, i2]:= 0 else CameraMat[i1, i2]:= 1; // NormalM in CameraMat kopieren
InvertMatrix(CameraMat);
for i1:= 0 to 2 do for i2 := 0 to 2 do CameraAffMat[i1, i2]:= CameraMat[i1, i2];
NormalM[0, 0]:= X[0]; NormalM[1, 0]:= X[1]; NormalM[2, 0]:= X[2]; NormalM[0, 1]:= Z[0]; NormalM[1, 1]:= Z[1]; NormalM[2, 1]:= Z[2]; // Y and Z axes must be swapped for shader NormalM[0, 2]:= Y[0]; NormalM[1, 2]:= Y[1]; NormalM[2, 2]:= Y[2];
NormalM:= MatrixMultiply(NormalM, CameraAffMat); // Camerarotation soll nicht wiederholt werden
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.