OpenGL mit GLUT: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
()
()
Zeile 107: Zeile 107:
 
  }
 
  }
 
=== Pascal (für FPC) ===
 
=== Pascal (für FPC) ===
<b>program</b> OpenGLTest;
+
 
<b>uses</b>
+
<pascal>program OpenGLTest;
  gl,glu,glut;
+
uses
<br />
+
  gl,glu,glut;
<b>var</b>
+
 
  <font color="#000080"><i>// Variablen die Fenster-Eigenschaften speichern</i></font>
+
var
  wnd_width:Integer  = 800;
+
  // Variablen die Fenster-Eigenschaften speichern
  wnd_height:Integer  = 600;
+
  wnd_width:Integer  = 800;
<br />
+
  wnd_height:Integer  = 600;
  <font color="#000080"><i>// Variablen die die Szehne betreffen.</i></font>
+
 
  rotX:Single=0;
+
  // Variablen die die Szehne betreffen.
  rotY:Single=0;
+
  rotX:Single=0;
<br />
+
  rotY:Single=0;
<b>procedure</b> InitGL; <b>cdecl</b>;
+
 
<font color="#000080"><i>//Funktion zur festlegung der Startbedinungen</i></font>
+
procedure InitGL; cdecl;
<b>begin</b>
+
//Funktion zur festlegung der Startbedinungen
  glClearColor<b>(</b>0.0,0.0,0.0,0.0<b>)</b>;          <font color="#000080"><i>//Hintergrundfarbe</i></font>
+
begin
  glEnable<b>(</b>GL_DEPTH_TEST<b>)</b>;<font color="#000080"><i>// Tiefenpuffer nutzen</i></font>
+
  glClearColor(0.0,0.0,0.0,0.0);          //Hintergrundfarbe
<b>end</b>;
+
  glEnable(GL_DEPTH_TEST);// Tiefenpuffer nutzen
<br />
+
end;
<b>procedure</b> SpecialKey<b>(</b>key,x,y:Integer<b>)</b><b>cdecl</b>;
+
 
<b>begin</b>
+
procedure SpecialKey(key,x,y:Integer);  cdecl;
  <b>case</b> <b>(</b>key<b>)</b> <b>of</b>
+
begin
    GLUT_KEY_UP:    rotX := rotX -5;
+
  case (key) of
    GLUT_KEY_DOWN:  rotX := rotX +5;
+
  GLUT_KEY_UP:    rotX := rotX -5;
    GLUT_KEY_LEFT:  rotY := rotY -5;
+
  GLUT_KEY_DOWN:  rotX := rotX +5;
    GLUT_KEY_RIGHT: rotY := rotY +5;
+
  GLUT_KEY_LEFT:  rotY := rotY -5;
  <b>end</b>;
+
  GLUT_KEY_RIGHT: rotY := rotY +5;
  glutPostRedisplay;
+
  end;
<b>end</b>;
+
  glutPostRedisplay;
<br />
+
end;
<b>procedure</b> Resize<b>(</b>width,height:Integer<b>)</b>;<b>cdecl</b>;
+
 
<b>begin</b>
+
procedure Resize(width,height:Integer);cdecl;
  glViewport<b>(</b>0,0,width,height<b>)</b>;
+
begin
  wnd_width := width;
+
  glViewport(0,0,width,height);
  wnd_height := height;
+
  wnd_width := width;
<b>end</b>;
+
  wnd_height := height;
<br />
+
end;
<b>procedure</b> Render;
+
 
<b>begin</b>
+
procedure Render;
  <font color="#000080"><i>//Projektionsmatrix einstellen</i></font>
+
begin
  glMatrixMode<b>(</b>GL_PROJECTION<b>)</b>;
+
  //Projektionsmatrix einstellen
  glLoadIdentity;
+
  glMatrixMode(GL_PROJECTION);
  gluPerspective<b>(</b>60.0, 1.0, 1.0, 200.0<b>)</b>;
+
  glLoadIdentity;
<br />
+
  gluPerspective(60.0, 1.0, 1.0, 200.0);
  glMatrixMode<b>(</b>GL_MODELVIEW<b>)</b>;
+
 
  glLoadIdentity;
+
  glMatrixMode(GL_MODELVIEW);
  <font color="#000080"><i>(* Modeltransformation ausfuehren... *)</i></font>
+
  glLoadIdentity;
<br />
+
  (* Modeltransformation ausfuehren... *)
  glTranslatef <b>(</b>0.0, 0.0 ,-4.0<b>)</b>;    <font color="#000080"><i>// Verschiebung in z-Richtung nach hinten</i></font>
+
 
  glRotatef <b>(</b>rotX, 1.0, 0.0, 0.0<b>)</b><font color="#000080"><i>// Rotation um die x-Achse</i></font>
+
  glTranslatef (0.0, 0.0 ,-4.0);    // Verschiebung in z-Richtung nach hinten
  glRotatef <b>(</b>rotY, 0.0, 1.0, 0.0<b>)</b><font color="#000080"><i>// Rotation um die y-Achse</i></font>
+
  glRotatef (rotX, 1.0, 0.0, 0.0);  // Rotation um die x-Achse
  glTranslatef <b>(</b>-0.5, -0.5 , -0.5<b>)</b>; <font color="#000080"><i>// Verschiebung</i></font>
+
  glRotatef (rotY, 0.0, 1.0, 0.0);  // Rotation um die y-Achse
<br />
+
  glTranslatef (-0.5, -0.5 , -0.5); // Verschiebung
  glClear<b>(</b>GL_COLOR_BUFFER_BIT <b>or</b> GL_DEPTH_BUFFER_BIT<b>)</b><font color="#000080"><i>// Puffer leeren</i></font>
+
 
  glBegin <b>(</b>GL_QUADS<b>)</b>;
+
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // Puffer leeren
    glColor3f <b>(</b>0.0, 0.0, 0.0<b>)</b>; glVertex3f <b>(</b>0.0, 0.0,0.0<b>)</b>;
+
  glBegin (GL_QUADS);
    glColor3f <b>(</b>1.0, 0.0, 0.0<b>)</b>; glVertex3f <b>(</b>1.0, 0.0,0.0<b>)</b>;
+
    glColor3f (0.0, 0.0, 0.0); glVertex3f (0.0, 0.0,0.0);
    glColor3f <b>(</b>1.0, 0.0, 1.0<b>)</b>; glVertex3f <b>(</b>1.0, 1.0,0.0<b>)</b>;
+
    glColor3f (1.0, 0.0, 0.0); glVertex3f (1.0, 0.0,0.0);
    glColor3f <b>(</b>0.0, 0.0, 1.0<b>)</b>; glVertex3f <b>(</b>0.0, 1.0,0.0<b>)</b>;
+
    glColor3f (1.0, 0.0, 1.0); glVertex3f (1.0, 1.0,0.0);
  glEnd;
+
    glColor3f (0.0, 0.0, 1.0); glVertex3f (0.0, 1.0,0.0);
<br />
+
  glEnd;
  <font color="#000080"><i>(* Back-Buffer in den Front-Buffer kopieren. *)</i></font>
+
 
  glutSwapBuffers<b>()</b>;
+
  (* Back-Buffer in den Front-Buffer kopieren. *)
<b>end</b>;
+
  glutSwapBuffers();
<br />
+
end;
<b>begin</b>
+
 
  glutInit<b>(</b>@argc, argv<b>)</b>;              <font color="#000080"><i>//Initialsierung der GLUT-Bibliothek</i></font>
+
 
  glutInitDisplayMode<b>(</b> GLUT_DOUBLE <b>or</b> <font color="#000080"><i>// doppelter Puffer</i></font>
+
begin
                        GLUT_DEPTH  <b>or</b> <font color="#000080"><i>// Tiefen Puffer vorhanden</i></font>
+
  glutInit(@argc, argv);              //Initialsierung der GLUT-Bibliothek
                        GLUT_RGB<b>)</b>;    <font color="#000080"><i>// Farbpuffer mit Rot,Grün und Blau</i></font>
+
  glutInitDisplayMode(  GLUT_DOUBLE or // doppelter Puffer
  glutInitWindowSize<b>(</b>wnd_width,wnd_height<b>)</b>;            <font color="#000080"><i>//Fenstergrösse festlegen(Breite, Höhe)</i></font>
+
                        GLUT_DEPTH  or // Tiefen Puffer vorhanden
  <font color="#000080"><i>// glutInitWindowPosition(100,100);        //Position des Fensters</i></font>
+
                        GLUT_RGB);    // Farbpuffer mit Rot,Grün und Blau
  glutCreateWindow<b>(</b><font color="#800000">'Hallo Welt!'</font><b>)</b>;        <font color="#000080"><i>//Fenstertitel</i></font>
+
  glutInitWindowSize(wnd_width,wnd_height);            //Fenstergrösse festlegen(Breite, Höhe)
<br />
+
// glutInitWindowPosition(100,100);        //Position des Fensters
  InitGL<b>()</b>;
+
  glutCreateWindow('Hallo Welt!');        //Fenstertitel
<br />
+
 
  <font color="#000080"><i>//Festlegen der Funktionen die GLUT verwenden soll</i></font>
+
  InitGL();
  glutDisplayFunc<b>(</b>@Render<b>)</b>; <font color="#000080"><i>// Funktion zum zeichnen des Bildes</i></font>
+
 
  glutReshapeFunc<b>(</b>@Resize<b>)</b>; <font color="#000080"><i>//Funktion die auf Größenänderungen des Fensers eingeht</i></font>
+
  //Festlegen der Funktionen die GLUT verwenden soll
  glutSpecialFunc<b>(</b>@SpecialKey<b>)</b>;<font color="#000080"><i>//Funktion zur Behandlung von Sondertasten z.B.: Pfeiltasten</i></font>
+
  glutDisplayFunc(@Render); // Funktion zum zeichnen des Bildes
<br />
+
  glutReshapeFunc(@Resize); //Funktion die auf Größenänderungen des Fensers eingeht
  glutMainLoop<b>()</b>;            <font color="#000080"><i>//eine Art Endlosschleife des Programms</i></font>
+
  glutSpecialFunc(@SpecialKey);//Funktion zur Behandlung von Sondertasten z.B.: Pfeiltasten
<b>end</b>.
+
 
 +
  glutMainLoop();            //eine Art Endlosschleife des Programms
 +
end.
  
 
== Compilern ==
 
== Compilern ==
Zeile 206: Zeile 208:
 
  -lopengl32
 
  -lopengl32
 
  -lglu32
 
  -lglu32
[[Kategorie:Anleitung]]
+
[[Kategorie:Anleitung]]</pascal>

Version vom 7. Mai 2005, 15:33 Uhr

OpenGL mit GLUT

GLUT bietet die Möglichkeit OpenGL-Anwendungen Betriebsystem unabhänig zu schreiben.

Erklärung des Quelltextes

Zunächst wird mit glutInit OpenGL initialisiert. Daraufhin legt man mit glutInitDisplayMode fest welche Puffer man haben möchte. GLUT_DOUBLE legt zum Beispiel fest das Doppelpufferung verwendet wird. Alternativ könnte hier auch GLUT_SINGLE für einen einfachen Puffer stehen. Anschließend wird die Größe und eventuell auch die Position des Fensers mit glutInitWindowSize und glutInitWindowPosition festgelegt. Darauf folgt dann die Erzeugung des Fensters mit einem Wunschtitel (per glutCreateWindow).

Nun erfolgt ein wichtiger Schritt, in dem man dem GLUT Funktionen für verschiedene Aufgaben zuweist. Am wichtigsten dürfte hierbei die Zuweisung der Zeichenfunktion per glutDisplayFunc sein. Des weitern wären da vielleicht noch folgende Funktionen:

  1. glutReshapeFunc - Zur Reaktion auf Größenänderungen
  2. glutSpecialFunc - Zur Reaktion auf das Drücken einer Sondertaste. z.B.: Pfeiltasten

Schlussendlich startet man dann noch eine Endlosschleife mit glutMainLoop, welche dann wiederum die oben übergebenen Funktionen aufruft.

Code-Übersicht

C++

#ifdef _WIN32
  #include <windows.h>
  #include <gl/gl.h>
  #define GLUT_DISABLE_ATEXIT_HACK
#endif
#include <GL/glut.h>
//Funktion zur festlegung der Startbedinungen void InitGL(void); //GLUT-Funktionen void Render(void); void Resize(int width, int height); void SpecialKey(int key, int x, int y);
// Variablen die Fenster-Eigenschaften speichern int wnd_width = 800; int wnd_height = 600;
// Variablen die die Szehne betreffen. float rotX=0; float rotY=0;
int main(int argc, char **argv) { glutInit(&argc, argv); //Initialsierung der GLUT-Bibliothek glutInitDisplayMode( GLUT_DOUBLE | // doppelter Puffer GLUT_DEPTH | // Tiefen Puffer vorhanden GLUT_RGB); // Farbpuffer mit Rot,Grün und Blau glutInitWindowSize(wnd_width,wnd_height); //Fenstergrösse festlegen(Breite, Höhe) // glutInitWindowPosition(100,100); //Position des Fensters glutCreateWindow("Hallo Welt!"); //Fenstertitel
InitGL();
//Festlegen der Funktionen die GLUT verwenden soll glutDisplayFunc(&Render); // Funktion zum zeichnen des Bildes glutReshapeFunc(&Resize); //Funktion die auf Größenänderungen des Fensers eingeht glutSpecialFunc(&SpecialKey);//Funktion zur Behandlung von Sondertasten z.B.: Pfeiltasten
glutMainLoop(); //eine Art Endlosschleife des Programms }

void InitGL(void) { glClearColor(0.0,0.0,0.0,0.0); //Hintergrundfarbe glEnable(GL_DEPTH_TEST);// Tiefenpuffer nutzen }
void SpecialKey(int key, int x, int y) { switch (key) { case GLUT_KEY_UP: rotX -= 5; break; case GLUT_KEY_DOWN: rotX += 5; break; case GLUT_KEY_LEFT: rotY -= 5; break; case GLUT_KEY_RIGHT: rotY += 5; break; default: return; } glutPostRedisplay(); }
void Resize(int width, int height) { glViewport(0, 0, (GLint)width, (GLint)height); wnd_width = width; wnd_height= height; }
void Render(void) { //Projektionsmatrix einstellen glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, 1.0, 1.0, 200.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* Modeltransformation ausfuehren... */ glTranslatef (0.0, 0.0 ,-4.0); // Verschiebung in z-Richtung nach hinten glRotatef (rotX, 1.0, 0.0, 0.0); // Rotation um die x-Achse glRotatef (rotY, 0.0, 1.0, 0.0); // Rotation um die y-Achse glTranslatef (-0.5, -0.5 , -0.5); // Verschiebung glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Puffer leeren glBegin (GL_QUADS); glColor3f (0.0, 0.0, 0.0); glVertex3f (0.0, 0.0,0.0); glColor3f (1.0, 0.0, 0.0); glVertex3f (1.0, 0.0,0.0); glColor3f (1.0, 0.0, 1.0); glVertex3f (1.0, 1.0,0.0); glColor3f (0.0, 0.0, 1.0); glVertex3f (0.0, 1.0,0.0); glEnd (); //glFlush(); //Zeichnen /* Back-Buffer in den Front-Buffer kopieren. */ glutSwapBuffers(); }

Pascal (für FPC)

program OpenGLTest;
uses
  gl,glu,glut;

var
  // Variablen die Fenster-Eigenschaften speichern
  wnd_width:Integer  = 800;
  wnd_height:Integer  = 600;

  // Variablen die die Szehne betreffen.
  rotX:Single=0;
  rotY:Single=0;

procedure InitGL; cdecl;
//Funktion zur festlegung der Startbedinungen
begin
  glClearColor(0.0,0.0,0.0,0.0);          //Hintergrundfarbe
  glEnable(GL_DEPTH_TEST);// Tiefenpuffer nutzen
end;

procedure SpecialKey(key,x,y:Integer);  cdecl;
begin
  case (key) of
   GLUT_KEY_UP:    rotX := rotX -5;
   GLUT_KEY_DOWN:  rotX := rotX +5;
   GLUT_KEY_LEFT:  rotY := rotY -5;
   GLUT_KEY_RIGHT: rotY := rotY +5;
  end;
  glutPostRedisplay;
end;

procedure Resize(width,height:Integer);cdecl;
begin
  glViewport(0,0,width,height);
  wnd_width := width;
  wnd_height := height;
end;

procedure Render;
begin
  //Projektionsmatrix einstellen
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(60.0, 1.0, 1.0, 200.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  (* Modeltransformation ausfuehren... *)

  glTranslatef (0.0, 0.0 ,-4.0);    // Verschiebung in z-Richtung nach hinten
  glRotatef (rotX, 1.0, 0.0, 0.0);  // Rotation um die x-Achse
  glRotatef (rotY, 0.0, 1.0, 0.0);  // Rotation um die y-Achse
  glTranslatef (-0.5, -0.5 , -0.5); // Verschiebung

  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);   // Puffer leeren
  glBegin (GL_QUADS);
    glColor3f (0.0, 0.0, 0.0); glVertex3f (0.0, 0.0,0.0);
    glColor3f (1.0, 0.0, 0.0); glVertex3f (1.0, 0.0,0.0);
    glColor3f (1.0, 0.0, 1.0); glVertex3f (1.0, 1.0,0.0);
    glColor3f (0.0, 0.0, 1.0); glVertex3f (0.0, 1.0,0.0);
  glEnd;

  (* Back-Buffer in den Front-Buffer kopieren. *)
  glutSwapBuffers();
end;


begin
  glutInit(@argc, argv);              //Initialsierung der GLUT-Bibliothek
  glutInitDisplayMode(  GLUT_DOUBLE or // doppelter Puffer
                        GLUT_DEPTH  or // Tiefen Puffer vorhanden
                        GLUT_RGB);     // Farbpuffer mit Rot,Grün und Blau
  glutInitWindowSize(wnd_width,wnd_height);            //Fenstergrösse festlegen(Breite, Höhe)
 // glutInitWindowPosition(100,100);        //Position des Fensters
  glutCreateWindow('Hallo Welt!');        //Fenstertitel

  InitGL();

  //Festlegen der Funktionen die GLUT verwenden soll
  glutDisplayFunc(@Render); // Funktion zum zeichnen des Bildes
  glutReshapeFunc(@Resize); //Funktion die auf Größenänderungen des Fensers eingeht
  glutSpecialFunc(@SpecialKey);//Funktion zur Behandlung von Sondertasten z.B.: Pfeiltasten

  glutMainLoop();             //eine Art Endlosschleife des Programms
end.

== Compilern ==
==== GNU C++ Compiler unter Linux ====
Mit dem GNU C++ Compiler den fast jedes Unix System enthält kann nun das Programm compilert werden.
In der Konsole gibt man nun einfach ein:
 <b>c++ -lglut NamederDatei.cpp</b>
Das fertige Programm kann man mit folgenden Befehl ausführen:
 <b>./a.out</b>

==== Dev-C++ unter Windows ====
Unter Projekt/Projekt Optionen müssen dem Linker noch zusätzlich folgende Parameter angegeben werden:

 -lglut
 -lopengl32
 -lglu32
[[Kategorie:Anleitung]]