nahtlinien an den ecken eines würfels
-
wenn ich eine skybox rendern möchte, dann bekoome ich recht hässliche kanten, die vorallem an den ecken sichtbar sind.
http://img151.imageshack.us/my.php?image=nhtyf5.pngdas ist der code mit dem ich die box zeichne und die texturen lade. ich hoffe, mir kann jemand weiterhelfen. denn eine skybox mit kantenlinien ist iregndwie sinnlos.
void Map::drawSkybox() { if(bSkyBoxLoaded == false) return; // Store the current matrix glPushMatrix(); // Reset and transform the matrix. glLoadIdentity(); glRotatef(-cam->m_pitch, 1.f, 0.f, 0.f); glRotatef(-cam->m_head, 0.f, 1.f, 0.f); // Enable/Disable features glPushAttrib(GL_ENABLE_BIT); glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDisable(GL_BLEND); glColor4f(1.0, 1.0, 1.0,1.0f); // Common Axis Z - FRONT Side // Render the front quad glBindTexture(GL_TEXTURE_2D, SkyBox[0]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f( 0.5f, -0.5f, -0.5f ); glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f, -0.5f ); glTexCoord2f(1, 1); glVertex3f( -0.5f, 0.5f, -0.5f ); glTexCoord2f(0, 1); glVertex3f( 0.5f, 0.5f, -0.5f ); glEnd(); // Render the left quad glBindTexture(GL_TEXTURE_2D, SkyBox[1]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f( 0.5f, -0.5f, 0.5f ); glTexCoord2f(1, 0); glVertex3f( 0.5f, -0.5f, -0.5f ); glTexCoord2f(1, 1); glVertex3f( 0.5f, 0.5f, -0.5f ); glTexCoord2f(0, 1); glVertex3f( 0.5f, 0.5f, 0.5f ); glEnd(); // Render the back quad glBindTexture(GL_TEXTURE_2D, SkyBox[2]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, 0.5f ); glTexCoord2f(1, 0); glVertex3f( 0.5f, -0.5f, 0.5f ); glTexCoord2f(1, 1); glVertex3f( 0.5f, 0.5f, 0.5f ); glTexCoord2f(0, 1); glVertex3f( -0.5f, 0.5f, 0.5f ); glEnd(); // Render the right quad glBindTexture(GL_TEXTURE_2D, SkyBox[3]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f ); glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f, 0.5f ); glTexCoord2f(1, 1); glVertex3f( -0.5f, 0.5f, 0.5f ); glTexCoord2f(0, 1); glVertex3f( -0.5f, 0.5f, -0.5f ); glEnd(); // Render the top quad glBindTexture(GL_TEXTURE_2D, SkyBox[4]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f( -0.5f, 0.5f, -0.5f ); glTexCoord2f(0, 1); glVertex3f( -0.5f, 0.5f, 0.5f ); glTexCoord2f(1, 1); glVertex3f( 0.5f, 0.5f, 0.5f ); glTexCoord2f(1, 0); glVertex3f( 0.5f, 0.5f, -0.5f ); glEnd(); // Render the bottom quad glBindTexture(GL_TEXTURE_2D, SkyBox[5]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f ); glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f, 0.5f ); glTexCoord2f(1, 1); glVertex3f( 0.5f, -0.5f, 0.5f ); glTexCoord2f(1, 0); glVertex3f( 0.5f, -0.5f, -0.5f ); glEnd(); // Restore enable bits and matrix glPopAttrib(); glPopMatrix(); }inline GLuint LoadTexture (char *filename) { GLuint texid; fipImage fimage; if(fimage.load(filename) ) { float fWidth = fimage.getWidth(); float fLength = fimage.getHeight(); glGenTextures (1, &texid); glBindTexture (GL_TEXTURE_2D, texid); if(fimage.getImageType() == FIT_BITMAP) { if(fimage.getBitsPerPixel() == 24) glTexImage2D(GL_TEXTURE_2D,0,3,fWidth,fLength,0,GL_RGB,GL_UNSIGNED_BYTE,fimage.accessPixels() ); else if(fimage.getBitsPerPixel() == 32) glTexImage2D(GL_TEXTURE_2D,0,4,fWidth,fLength,0,GL_RGBA,GL_UNSIGNED_BYTE,fimage.accessPixels() ); else return -1; } // else glTexImage2D (GL_TEXTURE_2D, 0, 3, fWidth, fLength, 0, GL_BGR, GL_UNSIGNED_BYTE, fimage.accessPixels() ); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, fWidth, fLength, GL_BGR, GL_UNSIGNED_BYTE, fimage.accessPixels() ); } else { printf ("could not load image %s\n", filename ); texid = 0; } fimage.clear(); return texid; }
-
lass mal die texturen weg und färbe die flächen einfarbig und schau, ob dann immernoch kanten zu sehen sind.
Wenn nicht, dann liegts daran, dass die Übergänge zwischen den texturen nicht fließend sind.
Wenn doch: Wie siehts aus mit Beleuchtung? sind die Normalen verschiedener aufeinandertreffenden Flächen an den Auftreffstellen gleich ausgerichtet?
-
das box-feeling verschwindet sofort...
wo kriegt man eigentlich bessere texturen für die skybox her?edit: ich habe mal probiert, die textur lässt sich zusammensetzen, ich versteh nur nicht warum ich dann die kantenlinien bekomme!
-
Hi,
das sieht nach Rundungsfehlern beim Texturesampling aus wo der Sample Werte < 0.0 bzw. > 1.0 auf die andere Seite der Texture wrapped. Stell den Texture Wrap Mode auf GL_CLAMP statt auf GL_REPEAT.
Ciao,
Stefan
-
ok, hat geklappt.
-
Bitte.
Ich hoffe du hast auch gleich die Dokumentation des Texture Wrapping gelesen was das bewirkt ...

Ciao,
Stefan
-
nunja, ich bin mir nicht ganz sicher welchen sinn das repeat hat, wenn umwicklungsartefakte entstehen?
-
Ich bin mir nicht sicher was du jetzt genau meinst, aber GL_REPEAT hat dort einen Sinn wo man ein kleines Stück Textur auf einem grösseren 3D-Objekt wiederholen lassen will (also quasi "kacheln").