Fortran: f03gl
<< zur Fortran-Startseite | |
< DISLIN | japi > |
Allgemeines
[Bearbeiten]f03gl ist ein Fortran 2003-Interface für OpenGL, speziell für GLUT, freeglut und OpenGLUT. f03gl kann als der Nachfolger von f90gl betrachtet werden.
Beispiel
[Bearbeiten]Fortran 2003 (oder neuer)-Code |
module bsp_ogl contains subroutine display() use opengl_gl use opengl_glut implicit none call glclear(GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT) call glColor3f( 0.2, 1.0, 0.3 ) call glutSolidTeapot( 50.0_gldouble ) call glutswapbuffers end subroutine display subroutine gfxinit use opengl_gl use opengl_glu implicit none real( glfloat ), dimension( 4 ) :: pos = (/ 100.0, 100.0, 200.0, 1.0 /) call glenable( GL_LIGHTING ) call glenable( GL_LIGHT0 ) call glenable( GL_DEPTH_TEST ) call glenable( GL_COLOR_MATERIAL ) call glenable( GL_NORMALIZE ) call glenable( GL_POLYGON_SMOOTH ) call gllightfv( GL_LIGHT0, GL_POSITION, pos ) call glClearColor( 0.7, 0.7, 0.7, 0.0 ) call glmatrixmode( GL_PROJECTION ) call glOrtho( -100.0_gldouble, 100.0_gldouble, -100.0_gldouble, 100.0_gldouble, & -100.0_gldouble, 100.0_gldouble ); call glmatrixmode( GL_MODELVIEW ) call glrotatef( 35.0, 1.0, 0.0, 0.0 ) call glrotatef( -25.0, 0.0, 1.0, 0.0 ) end subroutine gfxinit end module bsp_ogl program bsp use opengl_glut use bsp_ogl use, intrinsic :: iso_c_binding implicit none integer :: i call glutinit() call glutinitdisplaymode( GLUT_DOUBLE + GLUT_RGB + GLUT_DEPTH ) i = glutcreatewindow( "Beispiel" // c_null_char ) call gfxinit call glutdisplayfunc( display ) call glutmainloop end program bsp |
Um das Beispiel nutzen zu können, müssen die Dateien OpenGL_gl.f90, OpenGL_glu.f90 und wahlweise OpenGL_glut,f90, OpenGL_freeglut.f90 oder OpenGL_openglut.f90 von der Webseite „Fortran 2003 Interface to OpenGL" herunter geladen werden. Die ersten beiden Dateien sind das Interface zu den beiden Bibliotheken GL (Graphics Library) und GLU. Die drei anderen Dateien sind das Interface für die Utility Toolkits GLUT, freeglut bzw. OpenGLUT.
Diese Dateien müssen dann kompiliert werden, beispielsweise für die Verwendung der freeglut:
g95 -c OpenGL_gl.f90 g95 -c OpenGL_glu.f90 g95 -c OpenGL_freeglut.f90
Kompilieren und Linken des Beipielprogrammses bsp.f03, hier als Beispiel, wenn sich die opengl_*.mod-Dateien und OpenGL_*.o-Dateien im gleichen Verzeichnis wie die Beispieldatei bsp.f03 befinden und die freeglut-Bibliothek verwendet wird (wie in einigen Linux-Distrubtionen wie z. B. Red Hat):
g95 -o bsp bsp.f03 OpenGL_gl.o OpenGL_glu.o OpenGL_freeglut.o -lGL -lGLU -lglut
Die Parameter -lGL, -lGLU geben die Pfade der beiden Bibliotheken GL und GLU an, während -lglut den Pfad des Utility Toolkits angibt.
Für Mac OS X ist folgende Sequenz zu verwenden:
g95 -o bsp bsp.f03 OpenGL_gl.o OpenGL_glu.o OpenGL_glut.o -framework Carbon -framework OpenGL -framework GLUT
Nach der Eingabe von:
./bsp
sollte als Ausgabe die Utah-Teekanne erscheinen:
Besonderheiten
[Bearbeiten]Die Routinen für OpenGL und die GLUT sind in C geschrieben und auch die meisten Anwendungen von OpenGL und GLUT erfolgen in C. Daraus ergeben sich einige Besonderheiten für die Einbindung von OpenGL und GLUT unter Fortran.
In C lässt sich folgender Code erzeugen:
int main( int argc, char* argv[]) { ... glutReshapeFunc(ChangeSize); ... return 0; }
void ChangeSize(GLsizei w, GLsizei h) { ... }
Dabei ist GLsizei ein von OpenGL spezifizierter Datentyp vom Typ integer.
In Fortran 2003 sieht das selbe Code-Fragement unter Verwendung der C-Interoperabilität von Fortran 2003 zum Beispiel folgenderweise aus:
Fortran 2003 (oder neuer)-Code |
module simple_opengl_things use opengl_gl use opengl_glu use opengl_glut contains ... subroutine ChangeSize(w, h) bind(c) implicit none integer( kind=GLsizei ), value :: w integer( kind=GLsizei ), value :: h ... end subroutine ChangeSize ... end module simple_open_gl_things program simple_opengl use opengl_glut use simple_opengl_things ... call glutReshapeFunc( ChangeSize ) ... end program simple_opengl |
Weblinks
[Bearbeiten]
<< zur Fortran-Startseite | |
< DISLIN | japi > |