PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL: Durchscheinende Wände



zeeman
30-08-2005, 12:12
Schönen guten Tag zusammen!

Ich versuche mich nun an OpenGL, komme da aber nicht sonderlich weit.
Ich hab mal mit den Nehe-Tutorials angefangen, hänge aber schon bei Nr. 5.:

Wie man auf dem 1. Bild schön sehen kann, wird eine Pyramide gezeichnet die sich dreht.
Sieht ja soweit auch alles ganz korrekt aus.

Wenn die Pyramide sich aber ca. 180° weiter gedreht hat, dann leuchtet die rote (jetzt Rück-)Wand durch den Rest der Pyramide durch.
Warum?

Hab ich ne fehler in meinem Code?


void worker_func(void)
{
static int rotation = 0;
float height;
GLfloat rtri;

// Create window for OpenGL output
if (!SDL_SetVideoMode(640, 480, 32, SDL_OPENGL)) {
printf ("Failed to create window\n");
kiosk_vtable.disable_plugin (&kiosk_vtable);
return;
}

glViewport(0,0,640,480);
glMatrixMode(GL_PROJECTION);
gluPerspective(45, 640/480, 1, 10);
glMatrixMode(GL_MODELVIEW);

glLoadIdentity(); // Reset The View
glTranslatef(-0.0f,0.0f,-6.0f); // Move Left And Into The Screen

while (thread_control == GO) {

// Get the bass amplitude
SDL_mutexP(mutex);
height = shared_freq_data[0][0] / 1024.0;
SDL_mutexV(mutex);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glRotatef(0.2f,0.0f,1.0f,0.0f); // Rotate The Pyramid On It's Y Axis

// Draw pyramid
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Front)
glColor3f(0.0f,1.0f,0.0f); // Green
glVertex3f(-1.0f,-1.0f, 1.0f); // Left Of Triangle (Front)
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f( 1.0f,-1.0f, 1.0f); // Right Of Triangle (Front)

glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Right)
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f( 1.0f,-1.0f, 1.0f); // Left Of Triangle (Right)
glColor3f(0.0f,1.0f,0.0f); // Green
glVertex3f( 1.0f,-1.0f, -1.0f); // Right Of Triangle (Right)

glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Back)
glColor3f(0.0f,1.0f,0.0f); // Green
glVertex3f( 1.0f,-1.0f, -1.0f); // Left Of Triangle (Back)
glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f(-1.0f,-1.0f, -1.0f); // Right Of Triangle (Back)

glColor3f(1.0f,0.0f,0.0f); // Red
glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Left)
// glColor3f(0.0f,0.0f,1.0f); // Blue
glVertex3f(-1.0f,-1.0f,-1.0f); // Left Of Triangle (Left)
// glColor3f(0.0f,1.0f,0.0f); // Green
glVertex3f(-1.0f,-1.0f, 1.0f); // Right Of Triangle (Left)
glEnd(); // Done Drawing The Pyramid // Done Drawing The Quad
glFinish();

SDL_GL_SwapBuffers();

xmms_usleep(1000000 / 70);
}
printf("Worker thread: Exiting\n");
}

Wie man vielleicht im Code sieht, ist das ganze Teil eines xmms-plugins, aber das dürfte OpenGL ja nicht stören...

Bin für jeden Rat dankbar. Programmiere mit OpenGL jetzt seit immerhin 3h :rolleyes:

dra
05-09-2005, 11:33
Bring mal glEnable( GL_DEPTH_TEST ); irgendwo in deiner Initialisierung unter, um den Depth-Buffer einzuschalten.

Oder du änderst das Backface-Culling mit glCullFace() und glCullMode. Redbook/Bluebook/Manpages helfen dir da weiter.

Gruß,
dra