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

61

10.08.2011, 10:58

Ja wirklich :P

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

62

10.08.2011, 12:03

So sieht das aus wenn ich noch die normale Modelview dazuaddiere:


(Link)


Aber ich finde auch immer wieder viel kompliziertere (naja) im Internet als meinen total simplen. Vielleicht sind sie auch zu simpel... z.B. sowas:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
uniform sampler2D texunit0;
uniform sampler2D texunit1;
uniform vec3 lpos;
varying vec4 pos;
varying vec3 normal;
varying vec3 lightVec;
varying vec3 viewVec;

void main( void )
{
pos= gl_ModelViewProjectionMatrix * gl_Vertex;
normal = normalize(gl_NormalMatrix * gl_Normal);
lightVec = normalize(lpos - pos.xyz);
viewVec = vec3 (normalize(- (gl_ModelViewProjectionMatrix *gl_Vertex)));

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
gl_TexCoord[2] = gl_TextureMatrix[0]*gl_ModelViewMatrix*gl_Vertex;
}

FRAGMENT:

uniform sampler2D texunit0;
uniform sampler2D texunit1;
uniform sampler2D texunit2;
uniform vec3 lpos;
varying vec4 pos;
varying vec3 normal;
varying vec3 lightVec;
varying vec3 viewVec;

void main( void )
{
gl_TexCoord[2] = gl_TexCoord[2]/gl_TexCoord[2].w;

gl_TexCoord[2]=(gl_TexCoord[2]+ 1.0) * 0.5;

vec4 base = texture2D(texunit0, gl_TexCoord[0].xy);
vec3 norm = texture2D(texunit1, gl_TexCoord[0].xy).xyz*2.0-1.0;
vec4 shadow = texture2D(texunit2,gl_TexCoord[2].xy);

norm = normalize(gl_NormalMatrix * norm);

float fresnel =max((norm.z-0.6)*-1.0,0.0);

float diffuse = max(dot(lightVec, norm),0.0);

float specular = max(dot(reflect(lightVec,norm), viewVec), 0.0)*1.7;

specular=pow(specular,8.0);

float shade=1;

if((shadow.z+0.005) < gl_TexCoord[2].z)
shade=0;
else
shade= diffuse;

gl_FragColor = (base* shade)+ (vec4(0.0,0.1,0.3,0.0)*fresnel) +(vec4(0.5,0.5,0.4,0.0)*specular*shade);
}


Da wird dann noch der Vektor zwischen Licht und Vertex errechnet und und und.
Also kann mein Shader wirklich so schlicht sein, oder liegt es einfach daran das es wirklich nicht sooo einfach ist?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

63

11.08.2011, 11:37


(Link)


Das ist doch schonmal bedeutend besser als vorher :)
Allerdings versteh ich nicht wieso es so geht:

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
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_PROJECTION_MATRIX, projection.getArray());

    //shadowMatrix = bias*projection*modelview;
    
    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    glLoadMatrixf(bias.getArray());
    
    glMultMatrixf(projection.getArray());
    glMultMatrixf(modelview.getArray());

    glGetFloatv(GL_TEXTURE_MATRIX, shadowMatrix.getArray());

    glMatrixMode(GL_MODELVIEW);
}


Und vorher nicht!? Ich hab die Matrizen mal einzeln ausgelesen und hier nacheinander multipliziert. Das gleiche Ergebnis wie

C-/C++-Quelltext

1
shadowMatrix = bias*projection*modelview;


allerdings sieht die Texturmatrix anders aus wenn ich sie so wie oben berechne?! Muss ich das jetzt verstehen? Die sieht dann wie folgt aus:

-0,7 -0,9 -0,3 -0,3
-0,4 0,06 -0,9 -0,9
-0,4 0,9 0,3 0,3
8,2 8,2 14,8 16,5

Allerdings ist das Ergebnis auf dem Bild in der Mitte immer noch nicht richtig oder? Hier mal zum ausprobieren: Download

Währe nett wenn sich das nochmal einer anguckt :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

64

11.08.2011, 16:39

Kann es sein, dass da links und recht verwechselt sind? Der Schatten in der Mitte sieht gespiegelt aus.
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]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

65

11.08.2011, 17:31

Im mittleren Bild ist definitiv "alles" falsch.
Der Schatten ist auf beiden Seiten des Objekts, sollte aber nur links sein.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

66

11.08.2011, 23:07

Danke das ihr mir sagt was ich selbst schon gesehen habe :D Ne, aber im Ernst, woher kommt das? Evt. z vertauscht? Weil "vor" dem Viech siehts ja schon ganz ok aus.

Und was mich noch viel mehr interessiert, warum multipliziert OpenGL Matrizen anders als der Rest der Welt???

PS: Ja ich probiere weiter und benutze das hier als "Blog"/Gedankensammlung/Hilfesuche

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

67

11.08.2011, 23:11

Und was mich noch viel mehr interessiert, warum multipliziert OpenGL Matrizen anders als der Rest der Welt???

Bist du dir sicher dass nicht einfach nur du deine Matritzen anders multiplizierst als der Rest der Welt? ;)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

68

11.08.2011, 23:23

Zitat

Bist du dir sicher dass nicht einfach nur du deine Matritzen anders multiplizierst als der Rest der Welt?


Ja, ehrlich gesagt bin ich mir da sicher, wie gesagt ich habs in Handarbeit doppelt und dreifach dann mit Taschenrechner dann mit Matrizen multiplikator im Internet und allen drum und dran ausprobiert und es ist richtig! Hier mal ein Beispiel :)


(Link)

(Ergebnis meines mat4 structs)

Und kann das stimmen?

[EDIT]

Ok, hab mich vertippt, sollte 80 und nicht 8 sein bei a11.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (11.08.2011, 23:28)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

69

11.08.2011, 23:30

http://de.wikipedia.org/wiki/Matrix_(Mat…nmultiplikation

Also alleine die 8 links oben kann gar nicht stimmen..

Octave meint das hier:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
octave-3.2.4.exe:1> A = [2 4 8 0; 4 5 -7 1; 9 4 -3 -2; 1 0 6 7]
A =

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

octave-3.2.4.exe:2> B = [6 -7 4 5; 9 0 0 -3; 4 -2 8 8; 9 3 -1 5]
B =

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

octave-3.2.4.exe:3> A*B
ans =

   80  -30   72   62
   50  -11  -41  -46
   60  -63   14   -1
   93    2   45   88


//EDIT:
Stimmt immer noch nicht ganz. Rechts oben gibts 62 und nicht 86.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

70

11.08.2011, 23:37

Und wie siehts aus von wegen column-major vs row-major? Ich hab mal einen Blick in dein Matrix.h aus dem zip von der letzten Seite geworfen, sieht mir aus als würdest du deine Matritzen als row-major interpretieren. glUniformMatrix() mit transpose auf GL_FALSE will aber column-major und glMultMatrixf() interpretiert die Arrays auch als column-major. Also vermute ich, wie schon eine Seite zuvor, dass deine Initialisierungen nicht stimmen:

C-/C++-Quelltext

1
2
3
4
5
6
float M[16] = {
  0.5f, 0.0f, 0.0f, 0.0f,
  0.0f, 0.5f, 0.0f, 0.0f,
  0.0f, 0.0f, 0.5f, 0.0f,
  0.5f, 0.5f, 0.5f, 1.0f
};

sollte in dem Fall

C-/C++-Quelltext

1
2
3
4
5
6
mat4 M = {
  0.5f, 0.0f, 0.0f, 0.5f,
  0.0f, 0.5f, 0.0f, 0.5f,
  0.0f, 0.0f, 0.5f, 0.5f,
  0.0f, 0.0f, 0.0f, 1.0f
};

entsprechen und du kannst dann auch nicht einfach so das was glGetFloatv liefert verwenden da dein operator * es genau verkehrt rum interpretiert...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (11.08.2011, 23:53)


Werbeanzeige