Fortran: f03gl
| << zur Fortran-Startseite | |
| < DISLIN | gtk-fortran > |
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, muss ein Software-Paket, z.B. von der Webseite f03gl, herunter geladen werden (Stand: August 2025). Dieses zip-Paket muss natürlich ausgepackt werden. Gebaut werden kann die f03gl-Software dann mit ( CMake):
mkdir build cd build cmake .. make make test sudo make install
Kompilieren und Linken des obigen Beispielprogrammes bsp.f90:
gfortran bsp.f90 -lGL -lGLU -lglut -lf03gl -I/usr/local/include/ -L/usr/local/lib/
Die GL-, GLU-Libraries usw. müssen natürlich auf dem Rechner installiert sein. Ansonsten hagelt es Fehlermeldungen.
Nach der Eingabe von:
./a.out
sollte als Ausgabe die Utah-Teekanne erscheinen:
Eventuell ist noch der LD_LIBRARY_PATH um das Verzeichnis /usr/local/lib (für die libf03gl-Bibliotheks-Datei) zu erweitern. Die beschriebene Vorgehensweise gilt für Linux (konkret OpenSUSE Leap 15.6).
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 | gtk-fortran > |