|

Einführung in OpenGL - Teil 11 - by Delax
Wenn ihr das Beispiel von letztem Mal laufen lasst bemerkt ihr etwas störendes: an den Rändern flackert immer wieder eine Fläche durch, die eigentlich hinter der aktuellen liegt. Ganz ähnlich wie Licht durch eine nicht ganz dichte Ritze dringt. Sehr unschön.
Die Lösung lautet: weg mit den nicht zu sehenden Flächen. Wir teilen OpenGL mit, das es alle Flächen, die für den Betrachter nicht zu sehen sind gar nicht erst gezeichnet werden. Folglich kann auch nichts mehr durchscheinen.
Aber hallo. Leuten, die jetzt ihr Hirn anstrengen sollten die Augen leuchten. Angenommen wir haben eine Szene, die 100.000 Dreiecke enthält. Aber von diesen 100.000 sind nur 40.000 zu sehen, alle anderen sind verdeckt. Wenn die Grafikkarte immer alle 100.000 Dreiecke zeichnen würde, wäre das die ultimative Verschwendung, denn von diesem Aufwand wäre nur 40% gerechtfertigt (eben diese 40.000 die nur zu sehen sind). Also nicht nur das unsere Programme besser aussehen, nein, sie werden auch noch schneller! Und das mit nur einer einzigen Zeile. (Naja, eigentlich zwei ;)
Um Hidden Surface Removal (das entfernen verdeckter Flächen) zu aktivieren genügt die Aktivierung des Features in der OpenGL_Init.
PROCEDURE OpenGL_Init;
begin
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(45.0,width/height,0.1,100.0);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glClearDepth(1.0); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
end;
Die erste Neuerung ist glEnable(GL_CULL_FACE);. Das aktiviert die ganze Sache. Doch wie entscheidet OpenGL was verdeckt ist und was nicht? Hmm, erinnert ihr euch an die Art, wie Flächen gezeichnet werden? Entweder im oder gegen den Uhrzeigersinn. Dadurch wird bestimmt, ob man die Vorder- oder Rückseite einer Fläche vor sich hat. Nun, wenn man die Rückseite einer Fläche sieht wird sie nicht gezeichnet, wenn man die Front sieht wird sie gezeichnet. Nach dem Prinzip läuft Hidden Surface Removal ab. Also achtet immer brav auf eure Flächen.
Mir glCullFace(GL_BACK); kann man bestimmen, ob Vorder- oder Rückseite nicht dargestellt wird. Also entweder GL_BACK oder GL_FRONT.
Man kann auch bestimmen in welche Richtung die zu zeichnenden Flächen nach vorne zeigen. Dazu setzt man vor dem zeichnen entweder glFrontFace(GL_CW) für Uhrzeigersinn oder glFrontFace(GL_CCW) gegen den Uhrzeigersinn. So kann man die "natürliche" Anordnung der Seiten verändern. Im großen und ganzen würde ich aber davon abraten den Standard CCW zu ändern (außer ihr habt spezielle Gründe dafür).
Also: ab jetzt aufpassen in welche Richtung ihr eure Flächen zeichnet. Das ist auch wichtig wenn Beleuchtung und Texture Mapping ins Spiel kommt. Ach ja: hier gibt es das komplette Beispiel zum rumspielen.
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|