Welcome to the new Friends-of-FPC!

Here you can find all kinds of information about the FreePascal Compiler. We have many tutorials and howtos as well as a selection of tools to help you with your programming. We also have some example codes for you. And if you want to contribute some information/ sources/ tools yourself you can do so.
Also we have finally relaunched the FoFPC forum. It's your chance for some Q&A about everything FreePascal.

Friends-of-FPC

Tutorials: Learn how to code with FreePascal.

Source Codes: A collection of examples, miscellaneous source codes and open source stuff.

Tools and Help Files: Intro- duction of some tools that might help you with FPC.

Community

Forum: Ask or answer questions about the FreePascal Compiler, programming or just babble about coding.

Contribute! Contribute your own Tutorial, Source Codes or Tools and send them to us!

Website

About: Information about Friends-of-FPC.org.

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

Useful Links









Link to us