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
Community-Fossil
Community-Fossil
Zitat
Warum bindest du die Shadowmap wenn du gerade dabei bist in sie zu rendern?
Zitat
Wie gibst du die Shadowmap danach aus (wo nur was Weißes rauskommt)?
Zitat
Schau mal was glCheckFramebufferStatus() sagt.
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.
Zitat
Die Texturkoordinaten für die Shadowmap sollten doch eigentlich scWdevide.xy und nicht shadowCoord.st sein, oder?
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.
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.
Community-Fossil
Community-Fossil
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); |
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); |
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); |
Community-Fossil
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); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (31.07.2011, 18:49)
Community-Fossil
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Community-Fossil
Community-Fossil
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; } |
Werbeanzeige