OpenGL mit GLUT: Unterschied zwischen den Versionen
Flo (Diskussion | Beiträge) K () |
K (→Code-Übersicht: Syntax-Highlighting für den C++-Code) |
||
(23 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | =OpenGL | + | =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: | ||
+ | # glutReshapeFunc - Zur Reaktion auf Größenänderungen | ||
+ | # 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== | ==Code-Übersicht== | ||
− | #include <GL/glut.h> | + | === C++ === |
+ | <source lang="cpp">#ifdef _WIN32 | ||
+ | #include <windows.h> | ||
+ | #include <gl/gl.h> | ||
+ | #define GLUT_DISABLE_ATEXIT_HACK | ||
+ | #endif | ||
+ | #include <GL/glut.h> | ||
+ | |||
//Funktion zur festlegung der Startbedinungen | //Funktion zur festlegung der Startbedinungen | ||
void InitGL(void); | void InitGL(void); | ||
Zeile 8: | Zeile 25: | ||
void Render(void); | void Render(void); | ||
void Resize(int width, int height); | void Resize(int width, int height); | ||
− | void SpecialKey(int key, int x, int y); | + | void SpecialKey(int key, int x, int y); |
+ | |||
// Variablen die Fenster-Eigenschaften speichern | // Variablen die Fenster-Eigenschaften speichern | ||
int wnd_width = 800; | int wnd_width = 800; | ||
− | int wnd_height = 600; | + | int wnd_height = 600; |
+ | |||
// Variablen die die Szehne betreffen. | // Variablen die die Szehne betreffen. | ||
float rotX=0; | float rotX=0; | ||
− | float rotY=0; | + | float rotY=0; |
+ | |||
int main(int argc, char **argv) | int main(int argc, char **argv) | ||
{ | { | ||
Zeile 23: | Zeile 43: | ||
glutInitWindowSize(wnd_width,wnd_height); //Fenstergrösse festlegen(Breite, Höhe) | glutInitWindowSize(wnd_width,wnd_height); //Fenstergrösse festlegen(Breite, Höhe) | ||
// glutInitWindowPosition(100,100); //Position des Fensters | // glutInitWindowPosition(100,100); //Position des Fensters | ||
− | glutCreateWindow("Hallo Welt!"); //Fenstertitel | + | glutCreateWindow("Hallo Welt!"); //Fenstertitel |
− | InitGL(); | + | |
+ | InitGL(); | ||
+ | |||
//Festlegen der Funktionen die GLUT verwenden soll | //Festlegen der Funktionen die GLUT verwenden soll | ||
glutDisplayFunc(&Render); // Funktion zum zeichnen des Bildes | glutDisplayFunc(&Render); // Funktion zum zeichnen des Bildes | ||
glutReshapeFunc(&Resize); //Funktion die auf Größenänderungen des Fensers eingeht | glutReshapeFunc(&Resize); //Funktion die auf Größenänderungen des Fensers eingeht | ||
− | glutSpecialFunc(&SpecialKey);//Funktion zur Behandlung von Sondertasten z.B.: Pfeiltasten | + | glutSpecialFunc(&SpecialKey);//Funktion zur Behandlung von Sondertasten z.B.: Pfeiltasten |
+ | |||
glutMainLoop(); //eine Art Endlosschleife des Programms | glutMainLoop(); //eine Art Endlosschleife des Programms | ||
− | } | + | } |
+ | |||
+ | |||
void InitGL(void) | void InitGL(void) | ||
{ | { | ||
glClearColor(0.0,0.0,0.0,0.0); //Hintergrundfarbe | glClearColor(0.0,0.0,0.0,0.0); //Hintergrundfarbe | ||
glEnable(GL_DEPTH_TEST);// Tiefenpuffer nutzen | glEnable(GL_DEPTH_TEST);// Tiefenpuffer nutzen | ||
− | } | + | } |
+ | |||
void SpecialKey(int key, int x, int y) | void SpecialKey(int key, int x, int y) | ||
{ | { | ||
Zeile 55: | Zeile 81: | ||
} | } | ||
glutPostRedisplay(); | glutPostRedisplay(); | ||
− | } | + | } |
+ | |||
void Resize(int width, int height) | void Resize(int width, int height) | ||
{ | { | ||
Zeile 61: | Zeile 88: | ||
wnd_width = width; | wnd_width = width; | ||
wnd_height= height; | wnd_height= height; | ||
− | } | + | } |
+ | |||
void Render(void) | void Render(void) | ||
{ | { | ||
Zeile 73: | Zeile 101: | ||
/* Modeltransformation ausfuehren... */ | /* Modeltransformation ausfuehren... */ | ||
− | glTranslatef (0.0, 0.0 ,- | + | 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 | glRotatef (rotY, 0.0, 1.0, 0.0); // Rotation um die y-Achse | ||
− | |||
− | |||
− | |||
glTranslatef (-0.5, -0.5 , -0.5); // Verschiebung | glTranslatef (-0.5, -0.5 , -0.5); // Verschiebung | ||
Zeile 91: | Zeile 117: | ||
/* Back-Buffer in den Front-Buffer kopieren. */ | /* Back-Buffer in den Front-Buffer kopieren. */ | ||
glutSwapBuffers(); | glutSwapBuffers(); | ||
− | } | + | }</source> |
+ | === Pascal (für FPC) === | ||
+ | |||
+ | <source lang="pascal">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; cdecl; | ||
+ | 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.</source> | ||
== Compilern == | == Compilern == | ||
+ | ==== GNU C++ Compiler unter Linux ==== | ||
Mit dem GNU C++ Compiler den fast jedes Unix System enthält kann nun das Programm compilert werden. | 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: | In der Konsole gibt man nun einfach ein: | ||
− | + | '''c++ -lglut NamederDatei.cpp''' | |
Das fertige Programm kann man mit folgenden Befehl ausführen: | Das fertige Programm kann man mit folgenden Befehl ausführen: | ||
− | + | '''./a.out''' | |
+ | |||
+ | ==== Dev-C++ unter Windows ==== | ||
+ | Unter Projekt/Projekt Optionen müssen dem Linker noch zusätzlich folgende Parameter angegeben werden: | ||
+ | |||
+ | -lglut | ||
+ | -lopengl32 | ||
+ | -lglu32 | ||
+ | [[Kategorie:Anleitung]] |
Aktuelle Version vom 17. Oktober 2013, 19:23 Uhr
Inhaltsverzeichnis
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:
- glutReshapeFunc - Zur Reaktion auf Größenänderungen
- 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; cdecl;
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:
c++ -lglut NamederDatei.cpp
Das fertige Programm kann man mit folgenden Befehl ausführen:
./a.out
Dev-C++ unter Windows
Unter Projekt/Projekt Optionen müssen dem Linker noch zusätzlich folgende Parameter angegeben werden:
-lglut -lopengl32 -lglu32