Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 21:25

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Skybox Rendering
BeitragVerfasst: Di Mär 13, 2012 16:25 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hallo,

ich versuche gerade eine Skybox mittels einer Cubemap mit GLSL und einem VBO zu rendern.
Eigentlich ziemlich einfach, merkwürdiger weise ist aber meine Skybox komplett gespiegelt und ich versteh nicht warum.
Sprich der Himmel ist unten, der boden oben usw.

Ich habe die 6 Cubemap faces überprüft, diese sind als Texture richtig geladen und sind auch richtig rum.

Nur beim Rendern ist die Skybox gespiegelt, siehe Bild:
Bild

Erzeugt wird das VBO mit diesen Daten:
Code:
  1.  
  2.         // cube vertices for vertex buffer object
  3.         GLfloat cube_vertices[] = {
  4.           -1.0, -1.0, -1.0,  // Left bottom back
  5.            1.0, -1.0, -1.0,  // Right bottom back
  6.            1.0,  1.0, -1.0,  // Right top back
  7.           -1.0,  1.0, -1.0,  // Left top back
  8.           -1.0, -1.0,  1.0,  // Left bottom front
  9.            1.0, -1.0,  1.0,  // Right bottom front
  10.            1.0,  1.0,  1.0,  // Right top front
  11.           -1.0,  1.0,  1.0,  // Left top front
  12.         };
  13.      
  14.         // cube indices for index buffer object
  15.         const GLuint cube_indexCount = 24;
  16.         GLuint cube_indices[cube_indexCount] = {
  17.             4, 5, 1, 0, // Floor
  18.             6, 7, 3, 2, // Ceiling
  19.             2, 3, 0, 1, // Back
  20.             7, 6, 5, 4, // Front
  21.             3, 7, 4, 0, // Left side
  22.             6, 2, 1, 5, // Right side
  23.         };
  24.  


Die cubemap texture mit allen ihren 6 Faces werden so erzeugt:

Code:
  1.  
  2. void CTextureCubemap::Upload(char* pixels)
  3. {
  4. // pixels: 6 * (textureWidth * textureHeight * 4); RGBA
  5.  
  6.     GLuint newid = Create();
  7.     Bind();
  8.     glTexParameteri(getTarget(), GL_TEXTURE_MAG_FILTER, getTexMagFilter());
  9.     glTexParameteri(getTarget(), GL_TEXTURE_MIN_FILTER, getTexMinFilter());
  10.     glTexParameteri(getTarget(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  11.     glTexParameteri(getTarget(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  12.     glTexParameteri(getTarget(), GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  13.     for (int i = 0; i < 6; i++)
  14.     {
  15.         char* facePixels = &pixels[(getWidth() * getHeight() * 4) * i];
  16.         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, getInternalFormat(), getWidth(), getHeight(), 0, getFormat(), getType(), (GLvoid*)facePixels);
  17.     }
  18.     Unbind();
  19. }
  20.  


und schließlich so gerendert (backface culling aktiv):

Code:
  1.  
  2. void RenderScene(glm::mat4 &mvp){
  3.     //DrawGrid(40);
  4.     DrawAxes();
  5.  
  6.     // Default color
  7.     gRenderer->SetColor(1,1,1,1);
  8.  
  9.     glm::mat4 cubemapMVP = mvp * glm::scale(glm::mat4(1.0f),glm::vec3(100,100,100));
  10.  
  11.     glDepthMask(GL_FALSE);
  12.  
  13.     glClientActiveTexture(GL_TEXTURE0);
  14.     glEnable(GL_TEXTURE_CUBE_MAP);
  15.     cubemap->Bind();
  16.  
  17.     cubemapShader->Enable();   
  18.     cubemapShader->UniformMatrix4(cubemapShader->GetUniformLocation("mvp"), &cubemapMVP[0][0]);
  19.     cubemapShader->Uniform1i(cubemapShader->GetUniformLocation("cubemap"), 0);
  20.  
  21.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  22.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
  23.  
  24.     glEnableClientState(GL_VERTEX_ARRAY);
  25.     glVertexPointer(3, GL_FLOAT, sizeof(float) * 3, (void*)(0));
  26.     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, NULL);
  27.     glDisableClientState(GL_VERTEX_ARRAY);
  28.  
  29.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  30.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  31.  
  32.     cubemapShader->Disable();  
  33.  
  34.     cubemap->Unbind();
  35.     glDisable(GL_TEXTURE_CUBE_MAP);
  36.  
  37.     glDepthMask(GL_TRUE);
  38.  
  39. }
  40.  


Wenn ich die Matrix skalierung der Cubemap negativ mache, dann geht es, allerdings werden dann die Faces gecullt wenn ich drin bin (Was man leicht lösen könnte). Aber das ist doch nicht richtig so...

Die Shader sind auch ziemlich einfach:

Code:
  1.  
  2. --- vertex
  3. uniform mat4 mvp;
  4. varying vec3 texCoord;
  5. void main() {
  6.     gl_Position = mvp * vec4(gl_Vertex.xyz, 1.0);
  7.     texCoord = gl_Vertex;
  8. }
  9.  
  10. --- fragment
  11. uniform samplerCube cubemap;
  12. varying vec3 texCoord;
  13. void main() {
  14.     gl_FragData[0] = textureCube(cubemap, texCoord);
  15. }
  16.  


Was stimmt denn da nicht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Skybox Rendering
BeitragVerfasst: Di Mär 13, 2012 16:42 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Du könntest einfach texCoord.y = -texCoordy; machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Skybox Rendering
BeitragVerfasst: Di Mär 13, 2012 16:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
OpenglerF hat geschrieben:
Du könntest einfach texCoord.y = -texCoordy; machen.

So simpel aber effektiv. Das funktioniert, die x Coordinate musste ich ebenfalls invertieren, nur z bleibt gleich.

Allerdings frag ich mich, wieso es in diesem tutorial richtig ist:
http://www.keithlantz.net/2011/10/rendering-a-skybox-using-a-cube-map-with-opengl-and-glsl/


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]