Zum Inhalt springen

Fortran: f03gl

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



<< zur Fortran-Startseite
< DISLIN japi >