Zum Inhalt springen

Fortran: f03gl

Aus Wikibooks
<< 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
[Bearbeiten]



<< zur Fortran-Startseite
< DISLIN gtk-fortran >