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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

31

03.08.2011, 16:49

Stimmt deine shadow_matrix0?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

32

03.08.2011, 16:53

Ist:

0,0689 0 0 0
0 0,2685 0 0
0 0 0 0,0370
0 7,10 108 1

Kann das stimmen?
shadowCoord.z ist auf jeden Fall größer als 100, aber ich dachte das löst die bias?

[EDIT]

Liegts vielleicht daran das ich vorher transformiere?

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
void render(){  
    moveObjects(); // <--------------------------------- DA (glTranslate, ...)
    
    // Shadowmap
    glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);
    glUseProgram(0);
    glBindTexture(GL_TEXTURE_2D, 0);

    glViewport(0, 0, windowSize[0], windowSize[1]);
    glClear(GL_DEPTH_BUFFER_BIT);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1.0*windowSize[0]/windowSize[1], 2, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(lig.position[0], lig.position[1], lig.position[2],
              lig.lookat[0], lig.lookat[1], lig.lookat[2],
              view[6], view[7], view[8]);
        
    glCullFace(GL_FRONT);
        
    renderShadowMap();
    
    setShadowMatrix();

    // Szene
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);

    glViewport(0, 0, windowSize[0], windowSize[1]);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);   

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1.0*windowSize[0]/windowSize[1], 0.1, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(view[0], view[1], view[2],
              view[3], view[4], view[5],
              view[6], view[7], view[8]);
    
    glCullFace(GL_BACK);

    renderModels();
        
    glutSwapBuffers();
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

33

03.08.2011, 17:04

Die 1 da rechts unten in der Matrix kommt mir etwas merkwürdig vor...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

34

03.08.2011, 17:12

Schön das dir die Merkwürdig vorkommt :D
Ich hab keine Ahnung wie die Matrix aussehen müsste. Also berechne ich irgendwo falsch (Matizen, Shader)?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

35

03.08.2011, 17:17

Wie berechnest du die Matrix denn?

Liegts vielleicht daran das ich vorher transformiere?

Du verwendest doch Shader!? Transformierst du irgendwas auf der CPU bevor du es in dein VBO stopfst oder wie!?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

36

03.08.2011, 17:21

Zitat

Du verwendest doch Shader!? Transformierst du irgendwas auf der CPU bevor du es in dein VBO stopfst oder wie!?


Nein, nein ^^ Ich transformiere natürlich die Matizen und dann im Shader auf der GPU die Vertices...

Wie berechnest du die Matrix denn?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setShadowMatrix(){
    float modelview[16];
    float projection[16];
    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};

    glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
    glGetFloatv(GL_MODELVIEW_MATRIX, projection);

    for(unsigned int i = 0; i < 16; i++){
        shadowMatrix[i] = bias[i]*projection[i]*modelview[i];
    }
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

37

03.08.2011, 17:23

ähm, also was auch immer das da in Zeile 12-14 sein soll, Matritzenmultiplikation ist es keine...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

38

03.08.2011, 17:30

Achja ups :D Sorry hatte das noch nicht in der Schule... (Ja es ist traurig).
Mal sehen obs geht.

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

39

03.08.2011, 21:29

Wenn du Shader verwendest, warum dann immer noch die fixed function pipeline?
Warum kein modernes OpenGL?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

40

04.08.2011, 16:12

Nur für die Shadowmap, weils unnötig ist da groß was rumzurechnen (selber). Außerdem ist die Pipline nicht raus so wie bei Dx oder veraltet.

So es läuft noch nicht. Ich kenn mich mit der Berechnung nicht wirklich aus, aber das aus dem Tutorial schein nicht zu wollen ^^

Shadow Matrix:


(Link)


So wird die erstellt (die Multiplikation ist jetzt richtig):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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_MODELVIEW_MATRIX, projection.getArray());    

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


Shader:

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
Vertex:


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


Fragment:



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

    // Shadow mapping
    vec3 scWdevide = shadowCoord.xyz/shadowCoord.z;
    scWdevide.z += 0.0005;

    float depth = texture(shadowMap0, scWdevide.st).z;

    float shadow = 1.0;
    if(shadowCoord.z > 0.0){
        shadow = (depth < scWdevide.z) ? 0.5 : 1.0;
    }

    outColor *= shadow;

    if(shadowCoord.z > 102.0){
        outColor = vec4(1.0, 0.0, 0.0, 0.0);
    }
}

Werbeanzeige