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

71

12.08.2011, 00:00

Nagut^^ ich überarbeit das.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

72

12.08.2011, 10:39

Also glGetFloatv() lievert row-major aber glMultMatrix will dann column-major? Kann eigentlich nicht sein, wenn ich die Matrizen dann ohne zu transponieren einfach an glMultMatrix übergebe und es kommt was raus. Wenn ich sie transponiere bekomme ich nur einen schwarzen Strich.
Im Tutorial wird das auch genau so berechnet, nur wo ist der Unterschied zu meiner Matrixmultiplikation?
Wenn ich jetzt an glUniformMatrix true für transpose übergebe bekomme ich wieder nur den Strich :/
Und wenn ich die bias verändere bekomme ich garnichts mehr...
Ich verstehs gerade nicht ^^

Hier nochmal ein Bild:


(Link)


Was falsch ist sieht man ja und wird wahrscheinlich an der Matrix liegen :/

Achja und ich hab gerade nochmal mit Online Rechner nachgerechnet, mit transponierter Projection und Modelview. Anderes Ergebnis... die bias sollte ja schon column-major sein wenn die im Tutorial so angegeben ist und der die mit glLoadMatrixf einließt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (12.08.2011, 11:10)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

73

12.08.2011, 11:22

Also glGetFloatv() lievert row-major aber glMultMatrix will dann column-major?

Nein, glGetFloatv() liefert column-major und glMultMatrix will column-major. Aber dein mat4 ist row-major. Soweit ich das mitbekommen hab holst du dir deine View und Projection-Matrix ja von OpenGL per glGetFloatv() in einen mat4. D.h. der mat4 enthält die Daten dann verkehrt rum, weil glGetFloatv() packt column-major rein, dein operator * verwendet sie aber dann als row-major. Ich postuliere mal dass du das selbe Ergebnis wie OpenGL nur eben in row-major bekommst wenn du nicht

C-/C++-Quelltext

1
shadowMatrix = bias*projection*modelview;

sondern

C-/C++-Quelltext

1
shadowMatrix = modelview*projection*bias;

rechnest. Der Fehler liegt prinzipiell erstmal nicht in der Multiplikation sondern in den beiden Werten die multipliziert werden. Ich würde empfehlen entweder mat4 so umzubauen dass es kompatibel mit den in OpenGL üblichen Konventionen ist oder die View- und Projection-Matrix für mat4 selber und richtig zu bauen und niemals dein mat4 mit irgendwelchen OpenGL-Matritzenfunktionen zu vermischen. Der ganze Kram ist eigentlich eh sowieso deprecated.

Anderes Ergebnis... die bias sollte ja schon column-major sein wenn die im Tutorial so angegeben ist und der die mit glLoadMatrixf einließt.

Genau das ist ja unter Anderem das Problem: Die Bias-Matrix wie sie im Tutorial steht ist column-major, du brauchst sie aber row-major. Wie schon mehrmals gesagt: Du kannst nicht einfach das

C-/C++-Quelltext

1
2
3
4
    float bias[16] = {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};

aus dem Tutorial nehmen und ein

C-/C++-Quelltext

1
2
3
4
    mat4 bias(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);

draus machen, du musst die Werte noch transponieren da sie sonst für deine mat4 genau verkehrt rum sind. Das gleiche gilt für

C-/C++-Quelltext

1
2
  glGetFloatv(GL_MODELVIEW_MATRIX, modelview.getArray());
  glGetFloatv(GL_PROJECTION_MATRIX, projection.getArray());

Das funktioniert so nicht, denn OpenGL liefert da Daten in column-major-order. Du müsstest alle deine Matritzen noch transponieren. Oder dein mat4 so umändern dass es auch column-major arbeitet. Oder den Unterschied sonst irgendwie berücksichtigen, z.b. durch Umdrehen der Multiplikationsreihenfolge und anschließendes Transponieren bei der Übergabe an den Shader. Im Moment hast du jedenfalls ein furchtbares Durcheinander. Wie gesagt, es ist egal welche Konvention du verwendest, aber du musst dich für eine entscheiden. Einmal so und einmal so machen und beides dann vermischen wollen funktioniert nicht.

Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »dot« (12.08.2011, 11:37)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

74

13.08.2011, 15:46

Zitat

wenn du nicht... sondern... rechnest


Stimmt funktioniert :)

Liefert aber immer noch das besch**** Ergebnis von oben :(
Achja transponiert und invertiert man column-major Matrizen genauso wie row-major?

C-/C++-Quelltext

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
mat4 inverse(){
        mat4 m = mat4(values);

        values[0] = m.values[0];
        values[1] = m.values[4];
        values[2] = m.values[8];
        values[4] = m.values[1];
        values[6] = m.values[9];
        values[8] = m.values[2];
        values[9] = m.values[6];

        values[12] = values[0]*-m.values[12]+values[4]*-m.values[13]+values[8]*-m.values[14];
        values[13] = values[1]*-m.values[12]+values[5]*-m.values[13]+values[9]*-m.values[14];
        values[14] = values[2]*-m.values[12]+values[6]*-m.values[13]+values[10]*-m.values[14];

        values[3] = 0;
        values[7] = 0;
        values[11] = 0;
        values[15] = 1;

        return *this;
    }*/

    /*mat4 transpose(){
        mat4 m = mat4(values);

        values[1] = m.values[4];
        values[2] = m.values[8];
        values[3] = m.values[12];

        values[4] = m.values[1];
        values[6] = m.values[9];
        values[7] = m.values[13];

        values[8] = m.values[2];
        values[9] = m.values[6];
        values[11] = m.values[14];

        values[12] = m.values[3];
        values[13] = m.values[2];
        values[14] = m.values[11];
        
        return *this;
    }


quasi?

Hab dir das hier nochmal hochgeladen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (13.08.2011, 15:55)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

75

13.08.2011, 20:17

Achja transponiert und invertiert man column-major Matrizen genauso wie row-major?

Natürlich. column-major und row-major sind ja nur zwei Möglichkeiten wie man eine Matrix im Speicher repräsentiert. Am Konzept der Matrix ändert sich dadurch ja nix.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

76

13.08.2011, 20:50

Aber eventuell an den zu verwendenden Indices, sofern die Operation nicht symmetrisch ist ;)
Und ob sie das sind, das sollte er eigentlich wissen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

77

14.08.2011, 11:36

Sind sie ;)

Ich versteh trotzdem noch nicht warum das so scheiße aussieht, irgendwie dreht der den Schatten nicht um die Y-Achse...
Muss ich vielleicht die Position der Lichtquelle im Shader noch mit einrechnen?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

78

23.08.2011, 22:26

*zurück aus Urlaub, anderes Tutorial such*

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

79

24.08.2011, 12:48

Wofür hab ich mich überhaupt hier angemeldet :D


(Link)


Problem ist noch "self-shadowing" und:


(Link)


Wenn die Lichtquelle genau über dem Objekt ist...
Ich denke ihr habt keine Ahnung worans liegt? Trotzdem schonmal danke für die Selbst-Therapie :P

[EDIT]

Ok, Selbstbeschattung ist raus:


(Link)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (24.08.2011, 12:58)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

80

24.08.2011, 12:53

Self-shadowing liegt vermutlich an einem zu geringen Bias.
Zeig mal ein Bild "zwischen" den beiden Fällen.
Verschwindet der Schatten ab einem gewissen Winkel einfach, oder wie?

Werbeanzeige