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

21

30.07.2011, 11:27

Genau sowas wollte ich hören :)
So ich arbeite deinen Beitrag dann mal von oben nach unten ab, kann etwas dauern... Ich sag dann bescheid :D

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

22

30.07.2011, 17:42

So was ich bis jetzt gemacht habe (noch kein Erfolg):

Zitat

Warum bindest du die Shadowmap wenn du gerade dabei bist in sie zu rendern?


War nur ein Test, hab ich vergessen wieder weg zu machen...

Zitat

Wie gibst du die Shadowmap danach aus (wo nur was Weißes rauskommt)?



(Link)


Unten die Fläche, ist ja egal, nur zum Test.

Zitat

Schau mal was glCheckFramebufferStatus() sagt.


Gibt keinen Fehler (GL_FRAMEBUFFER_COMPLETE).

Zitat

Abgesehen davon wäre es wohl sehr viel effizienter die Multiplikation einmal auf der CPU zu machen und nicht im Shader für jeden Vertex aufs Neue.


Das stimmt, hab ich auch schon geschrieben das ich das nur so Teste :)

Zitat

Die Texturkoordinaten für die Shadowmap sollten doch eigentlich scWdevide.xy und nicht shadowCoord.st sein, oder?


Spielt nach meinem Buch keine Rolle, s = x, t = y. Aber ich kann das ja mal ändern.

Zitat

Statt den hoffnungslos veralteten Matrix-Stack von OpenGL zweckzuentfremden würd ich mir lieber selbst ein Paar Klassen für Vektoren/Matritzen schreiben oder was fertiges verwenden.


Zu Testzwecken, ich will erstmal die Grundlagen für halbwegs realistische Szenen hinbekommen und bau mir dann eine kleine Rendering "Engine".

Zum Rest von dir: nachdem die Shadowmap stimmt.

Ich arbeite dann mal weiter...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

30.07.2011, 17:49

Zitat

Die Texturkoordinaten für die Shadowmap sollten doch eigentlich scWdevide.xy und nicht shadowCoord.st sein, oder?


Spielt nach meinem Buch keine Rolle, s = x, t = y. Aber ich kann das ja mal ändern.

Es ging mir nicht um s/t vs. x/y sondern darum dass du die falsche Variable verwendest ;)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

24

30.07.2011, 20:29

Ups achso^^

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

25

31.07.2011, 11:30

Ich bekomm mein FBO nicht richtig aufgesetzt... Muss ich vielleicht einen Renderbuffer für das FBO festlegen?

C-/C++-Quelltext

1
2
3
4
5
glGenRenderbuffersEXT(1, &depthBuffer);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer);


Oder brauche ich:

C-/C++-Quelltext

1
2
3
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
    glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);


Auf jeden Fall wird nichts in das fBO gerendert (immer weiß). So siehts Momentan aus:

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
glGenTextures(1, &shadowMap); // Textur
    glBindTexture(GL_TEXTURE_2D, shadowMap);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glTexImage2D(GL_TEXTURE_2D, 
                 0,
                 GL_DEPTH_COMPONENT,
                 windowSize[0], 
                 windowSize[1],
                 0,
                 GL_DEPTH_COMPONENT, 
                 GL_UNSIGNED_BYTE, 
                 NULL);

    glGenFramebuffers(1, &shadowFBO); // FBO
    glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);

    glFramebufferTexture2D(GL_FRAMEBUFFER, 
                           GL_DEPTH_ATTACHMENT,
                           GL_TEXTURE_2D, 
                           shadowMap,
                           0);

    glDrawBuffer(GL_NONE);
    glReadBuffer(GL_NONE);
        
    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
        cerr<<"Framebuffer could not be initalized!"<<endl;
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

26

31.07.2011, 18:25

So ich hab was gefunden

Beim rendern mit:

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
void renderShadowMap(){
    glEnableVertexAttribArray(0); // Vertex

    for(unsigned int i = 0;  i < objects.size(); i++){      
        glPushMatrix();         

        glScalef(objects[i]->getScale(), objects[i]->getScale(), objects[i]->getScale());
        glTranslatef(objects[i]->getX(), objects[i]->getY(), objects[i]->getZ());
        glRotatef(objects[i]->getXRotation(), 1, 0, 0);
        glRotatef(objects[i]->getYRotation(), 0, 1, 0);
        glRotatef(objects[i]->getZRotation(), 0, 0, 1);
                                
        glBindBuffer(GL_ARRAY_BUFFER, objects[i]->getVertexBuffer());
        glVertexAttribPointer(GLint(0), 3, GL_FLOAT, GL_FALSE, 0, 0);
    
        glDrawArrays(GL_TRIANGLES, 0, objects[i]->getVerticesNumber());

        glPopMatrix();
    }

    glDisableVertexAttribArray(0);
}


und nach der Funktion glGetError -> 1280 GL_INVALID_ENUM
Aber was genau heißt das jetzt?

[EDIT]

Ok, liegt an einer anderen Funktion die ich aber erstmal nicht brauche :/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (31.07.2011, 18:49)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

27

31.07.2011, 19:11


(Link)


Das ist jetzt natürlich nicht der Schatten sondern die Shadowmap, aber sie ist da! :)
Ich führ hier irgendwie Selbstgespräche aber es scheint ja zu helfen... also darf ich damit weitermachen? ^^

MfG

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

28

31.07.2011, 19:31

Sollte die Shadow-Map nicht trotzdem immernoch aus Graustufen und nicht nur aus 2 Farben bestehen? Oder sind das Graustufen und die Near und Far-Plane sind einfach bescheiden gewählt?
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

29

01.08.2011, 16:15

Jap sinds. Near und Far ist glaube 1.0 und 100.0? Ist bescheiden würd ich sagen.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

30

03.08.2011, 16:45

So jetzt hab ich noch Probleme mit meinen Shadern:

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
62
63
64
65
66
67
68
// Matrizen

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];
    }
}

// Perspective

gluPerspective(45, 1.0*windowSize[0]/windowSize[1], 2, 100);

// Vertex

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*modelview_matrix*vec4(a_Vertex, 1.0);
    texCoord0 = a_TexCoord0;
    gl_Position = projection_matrix*(modelview_matrix*vec4(a_Vertex, 1.0));     
}

// Fragment

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);

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

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

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

    outColor *= shadow;
}


Hab das so schon mehrfach im Internet gesehen...
float shadow und shadowCoord.w im Fragmentshader schein immer 1.0 zu sein (getestet).
Ich sehs gerade nicht, ihr?

Werbeanzeige