Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

41

05.08.2011, 17:29

Ok, keine Ahnung worans liegen könnte... Wie sollte denn die Matrix jetzt ungefähr aussehen???

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

42

05.08.2011, 18:03

Ich denke das Problem ist das ich nicht die Textur Matrix nutze. Aber ich will die auch garnicht nutzen so wie hier: http://fabiensanglard.net/shadowmapping/index.php

Unterscheidet die sich von einer normalen Matrix?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

43

05.08.2011, 18:27

So es sollte richtig sein?! Läuft aber nicht:

Vertex Shader:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
uniform mat4 shadow_matrix0;

in vec3 a_Vertex;
in vec2 a_TexCoord0;

out vec2 texCoord0;
out vec4 shadowCoord;

void main(void){
    shadowCoord = shadow_matrix0*vec4(a_Vertex, 1.0);
    texCoord0 = a_TexCoord0;
    gl_Position = projection_matrix*(modelview_matrix*vec4(a_Vertex, 1.0));     
}


Fragment Shader:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
precision highp float;

uniform sampler2D texture0;
uniform sampler2D shadowMap0;

in vec4 shadowCoord;
in vec2 texCoord0;

out vec4 outColor;

void main(void){    
    outColor = texture(texture0, texCoord0.xy);

    vec4 shadowcoord = shadowCoord/shadowCoord.w;
    shadowcoord.z += 0.0005;
                
    float depth = texture(shadowMap0, shadowcoord.st).z;
                
    float shadow = 1.0;
    if(shadowCoord.w > 0.0){
        shadow = depth < shadowcoord.z ? 0.5 : 1.0;
    }
        
    outColor *= shadow;

    if(depth == 1.0){
        outColor *= 0.1;
    }
}


Shadow Textur (wird nach gluPerspecte, LookAt, ... aufgerufen):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setShadowMatrix(){
    mat4 modelview, projection;

    mat4 bias = mat4(0.5, 0.0, 0.0, 0.0, 
                     0.0, 0.5, 0.0, 0.0,
                     0.0, 0.0, 0.5, 0.0,
                     0.5, 0.5, 0.5, 1.0);

    glGetFloatv(GL_MODELVIEW_MATRIX, modelview.getArray());
    glGetFloatv(GL_PROJECTON_MATRIX, projection.getArray());

    shadowMatrix = bias;
    shadowMatrix *= projection;
    shadowMatrix *= modelview;
}


Testergebnisse:

So, depth im Fragment Shader ist immer 1.0?! Versteh ich schonmal nicht!
shadowcoord.z ist kleiner als 0...

Die Shadow Matrix (im Vertex Shader shadow_matrix0) ist jetzt:

0,1120 -0,0033 -0,0912 0,0000
0,2914 0,4770 0,0990 0,0000
-0,326 0,0589 0,3078 0,0000
-13,62 -11,80 -9,488 1,0000

KANN/SOLLTE DIE ÜBERHAUPT SO AUSSEHEN?

*Hoffe auf Hilfe*

MfG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (05.08.2011, 22:37)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

44

06.08.2011, 23:42

Ganz ehrlich? Ließt das überhaupt einer wenn ich hintereinander poste weils nicht als "Neuer Beitrag" angezeigt wird? Und so viele Leute wie hier rum laufen wird ja wohl einer Shadow Mapping in GLSL ohne Texture Matrix sondern mit Uniform Matrix umgesetzt haben und mir helfen könne?
Ist ja nicht so als würd ichs nicht versuchen... Mache schon eine Woche nichts anderes mehr und ich finde keinen Grund das das nicht laufen sollte.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

45

06.08.2011, 23:58

Wofür genau sind die Elemente in der 4ten Zeile deiner bias Matrix? Oder sind das die Spalten und nicht die Zeilen? Wie genau ist denn deine mat4 Klasse da zu verwenden? Warum genau wird auch z mit 0.5 multipliziert? Ich finde es auch nach einer Woche noch merkwürdig dass deine Shadowmatrix eine volle letzte Zeile hat, das bedeutet doch dass x und y einen Einfluss auf die w-Koordinate haben!? Oder hast du da Zeilen mit Spalten vertauscht!? Vergiss mal das Shadowmapping als Ganzes und schau erstmal dass die Einzelteile richtig funktionieren. Da hätten wir a) das Rendern der Shadowmap und b) die Projektion der Textur. Beides kannst du unabhängig voneinander testen. Schau ob a) der Inhalt der Shadowmap sinnvoll ist und ob du b) irgendeine Textur (nimm halt mal nen Smiley statt deiner Shadowmap von der du ja offenbar nicht sicher bist ob sie überhaupt was andres als weiß enthält) richtig auf die Szene projiziert bekommst. Solange weder a) noch b) funktionieren kann auch das Shadowmapping auf keinen Fall funktionieren...

Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von »dot« (07.08.2011, 00:16)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

46

07.08.2011, 00:18

Ich bin mir sogar ziemlich sicher das was in der Shadowmap ist :D


(Link)


Aber so ganz richtig ist das wohl nicht :/

Hier nochmal die Matrix (hab noch einen Fehler dazu gefunden):

Bias*Proj*Modelview

0 -0,73 0,5 0
0 0,7 0,98 0
0,5 0 4,5 -0,5
4,6 -0,03 5,8, -0,5

So, warum die letzte Reihe voll ist? Keine Ahnung... Werd ich Morgen (naja eigentlich Heute) mal nachforschen...

Um das magere Ergebnis da oben zu bekommen musste ich aber auch im Fragment Shader noch anders Normalisieren:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uniform sampler2D texture0;
uniform sampler2D shadowMap0;

in vec4 shadowCoord;
in vec2 texCoord0;

out vec4 color;

void main(void){    
    color = texture(texture0, texCoord0.st);

    //vec4 shadowTextureCoord = shadowCoord/shadowCoord.w;
    vec4 shadowTextureCoord = normalize(shadowCoord);
    shadowTextureCoord.z += 0.0005;
            
    float depth = texture(shadowMap0, shadowTextureCoord.st).z;
                
    //if(shadowCoord.w > 0.0){
        if(depth < shadowTextureCoord.z){
            color *= 0.5;
        }
    //}
}


So ich geh jetzt pennen, gute Nacht.

[EDIT]

Ach ganz kurz was mir gerade eingefallen ist: Muss ich x und y tauschen? Hab das irgendwo gelesen...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

47

07.08.2011, 00:25

Also wenn ich mir die Matrix und wie sie im Shader verwendet wird anschau dann komm ich zu dem Schluss dass da, warum auch immer, Zeilen mit Spalten vertauscht sind. Ob du da nur bei der Ausgabe was verwechselst oder es wirklich falsch in der Matrix drinsteht kann ich dir leider nicht sagen. Warum und wo willst du x und y vertauschen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (07.08.2011, 00:52)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

48

07.08.2011, 10:49

Also die x und y würde ich bei den Vertices tauschen (habe das glaube ich so gelesen, kann mich aber auch irren).
Und meine Matrix sieht von den Indexen halt so aus (float array [16]):

0 1 2 3
4 5 6 7
8 9 ...

und das soll dann so oder was:

0 4 8 12
1 5 9 13
2 6 10 14
37 11 15

?

Ich hab mir übrigens einfach mal alle Matrizen (Projection, Modelview aus Lichtperspektive) ausgeben lassen und die hatten in der letzten Zeile sowas wie:

0 0 -4 0 und 0 0 -7 1

Und per online Matrizen Rechner kommt da Bias*Proj*Model in der letzen Zeile

4,5 0,21 4,97 -0,5

raus (gerundet).

Noch eine Frage: Muss ich bei der Shadowmap alles rendern oder den Boden z.B. nicht? So hab ichs im Moment, ich render nur die Box. Aber die wirft ja dann auf sich selbst auch Schatten.

MfG

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

49

07.08.2011, 11:03

Also die x und y würde ich bei den Vertices tauschen (habe das glaube ich so gelesen, kann mich aber auch irren).

Und was für einen Sinn sollte das haben!?

Und meine Matrix sieht von den Indexen halt so aus (float array [16]):

0 1 2 3
4 5 6 7
8 9 ...

Ok. Und wie wird die an den Shader übergeben? Es geht hier eben darum was die Zeilen und was die Spalten sind. Deine "Matrix" ist ja erstmal nur ein Array von floats im Speicher. Zeilen vs. Spalten sind eine Frage der Interpretation. Und genau das ist aber eine sehr wesentliche Frage. Es gibt da kein "richtig" oder "falsch". Es gibt einfach zwei gleichwertige Möglichkeiten. Und um dir helfen zu können ist es wesentlich zu wissen welche Variante du verwendest. Denn ohne zu wissen wie die Matritzen überhaupt an den Shader übergeben werden ist jede weitere Diskussion völlig sinnlos. Um es nochmal klarzumachen: Es geht nicht um die genauen Zahlenwerte. Dass deine einzelnen Matritzen richtige Werte haben und deine Matritzenmultiplikation funktioniert, davon geh ich sowieso mal aus, das hast du mittlerweile ja sicherlich schon ausgiebig geprüft ;). Es geht rein um die Frage wie die Zahlen vom Shader interpretiert werden. Deine Zahlen können tausendmal "richtig" sein, wenn du die Werte so an den Shader gibst dass der deine Zeilen für Spalten hält. Dann wird trotzdem alles nur nicht das Richtige rauskommen. Und gerade eben waren deine Matritzen keine float[16] sondern irgendein Typ namens mat4. Da ist es natürlich gleich doppelt interessant zu wissen wie der zu verwenden ist...

Noch eine Frage: Muss ich bei der Shadowmap alles rendern oder den Boden z.B. nicht?

Naja, logischerweise alles was einen Schatten werfen soll...
So hab ichs im Moment, ich render nur die Box. Aber die wirft ja dann auf sich selbst auch Schatten.

Und das willst du nicht oder wie!?

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (07.08.2011, 11:18)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

50

07.08.2011, 11:26

So wird die shadowMatrix an die Shader übergeben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// beim finalen rendern:

shader[0]->sendUniform4x4("shadow_matrix0", shadowMatrix.getArray());

// Und die Funktion meiner Shaderklasse:

void GLSLProgram::sendUniform4x4(const string &name, const float *matrix, bool transpose){
    GLuint location = getUniformLocation(name);
    glUniformMatrix4fv(location, sizeof(matrix), transpose, matrix);
}


Zitat

Und das willst du nicht oder wie!?


Doch, aber nicht so wie du es oben im rechten Bild siehst. Da wirft die Box den Schatten nicht nur auf den Boden und auf die Seiten die vom Licht weg fallen sondern auch oben drauf (die gelbe Kugel ist die Lichtquelle).

Werbeanzeige