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 14 - by Delax

So, mit diffusem Licht trifft euch die ganze Theorie aus Teil 12. Also, legt euch den Ausdruck neben euch oder schaut ihn euch in einem anderen Fenster an, aber es ist hilfreich bei Unklarheiten nachzulesen worum es bei diesem und jenem eigentlich ging.

Nun benötigen wir für unsere Lichtquelle schon 3 Variablen. Eine für den ambienten Anteil, einen für den diffusen Anteil und eine für die Position der Lichtquelle. Anstatt die Werte erst in der OpenGL_Init einzutragen, definieren wir Default-Werte bereits bei der Erstellung.

  AmbientLight : array[0..3] of glFloat = (0.3,0.3,0.3,1.0);
  DiffuseLight : array[0..3] of glFloat = (1.0,1.0,1.0,1.0);
  LightPosition : array[0..3] of glFloat = (0.0,0.0,0.0,1.0);

Auch unsere OpenGL_Init ändert sich nun in einigen Punkten. Hier die neuen Definitionen.

  glEnable(GL_LIGHTING);           // Enable Lighting

  glLightfv(GL_LIGHT0,GL_AMBIENT, @AmbientLight);
  glLightfv(GL_LIGHT0,GL_DIFFUSE, @DiffuseLight);
  glEnable(GL_LIGHT0);

  glLightfv(GL_LIGHT0,GL_POSITION,@LightPosition);

Diesmal definieren wir eine Lichtquelle mit der Bezeichnung "LIGHT0". Zuerst mit glLightfv(GL_LIGHT0,GL_AMBIENT, @AmbientLight); den ambienten Teil des Lichts. Die Reihenfolge der Parameter ist Name der Lichtquelle, Typ des Lichts, Pointer zur Definition des Lichts. Selbiges machen wir für den diffusen Anteil der Lichtquelle. Dann aktivieren wir unser Licht. Erst danach setzen wir die Position der Lichtquelle auf unsere vorher angegebenen Default-Werte.

Nun folgt die Darstellung der Szene. Wir sehen uns nur den Anfang der Draw_OpenGL an.

PROCEDURE Draw_OpenGL;
begin

  glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

  glTranslatef( 0.0,-5.0,-50.0);

  glRotatef( 80,-1.0, 0.0, 0.0);
  glRotatef( rotation, 0.0, 0.0, 1.0);

  LightPosition[0] := 3.0;  LightPosition[1] := 5.0;
  LightPosition[2] := 5.0;  LightPosition[3] := 0.5;
  
  glLightfv(GL_LIGHT0,GL_POSITION,@LightPosition);

  glBegin(GL_QUADS);
  glColor3f( 0.0, 0.0, 0.5 );
   glNormal3f(0.0, 0.0, 1.0);
    glVertex3f( 10.0,-10.0, 0.0);
    glVertex3f( 10.0, 10.0, 0.0);
    glVertex3f(-10.0, 10.0, 0.0);
    glVertex3f(-10.0,-10.0, 0.0);
  glEnd(); 

Nun setzen wir eine neue Position für unsere Lichtquelle schräg hinter dem Würfel fest. Und teilen OpenGL auch mit das wir die Lichtquelle an diesem neuen Punkt haben wollen.

Wie ihr seht hat eine Lichtquelle 4 Positionsangaben. Die ersten 3 sind die X/ Y/ Z Werte der Lichtquelle. Die letzte Angabe setzt die Entfernung der Lichtquelle fest. 0 steht für "unendlich weit entfernt". Das ankommende Licht von dieser Lichtquelle erreicht die Szene parallel. 1.0 legt die Lichtquelle genau auf den angegebenen Punkt fest. Das Licht breitet sich davon kugelförmig aus.

Ab jetzt hat jede Fläche auch eine Normale. Diese definiert man mit glNormal3f und den üblichen Vertex-Koordinaten.

Ganz unten zeichnen wir noch einen Punkt ein, wo wir die Lichtquelle definiert haben, um sie so für uns sichtbar zu machen.

Den Source Code zum Beispiel gibt es hier. Und jetzt solltet ihr anfangen zu spielen. Ändert die Position der Lichtquelle und lasst sie um den Würfel rotieren. Oder ändert die Werte des Lichts in der Draw_OpenGL und findet heraus wie man durch Licht nette Effekte erzielen kann. Lernt am besten jede Art von Licht für sich und einzeln kennen, anstatt immer mit voller Beleuchtung zu arbeiten. Jede hat ihren Nutzen und kann ganz gezielt zum beleuchten einer Szene genutzt werden.

Delax/ Sundancer Inc.
[delax@sundancerinc.de]

Back to previous page

Useful Links









Link to us