[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
I assume you have basic knowledge of OpenGL API. Gauche-gl maps OpenGL calls to Scheme procedures pretty straightforwardly. For example, the very first example of "OpenGL Programming Guide", the pseudo code of OpenGL application, can be written in Gauche-gl like this:
(use gl) (define (main args) (initialize-a-window-please) (gl-clear-color 0.0 0.0 0.0 0.0) (gl-clear GL_COLOR_BUFFER_BIT) (gl-color 1.0 1.0 1.0) (gl-ortho 0.0 1.0 0.0 1.0 -1.0 1.0) (gl-begin* GL_POLYGON (gl-vertex 0.25 0.25 0.0) (gl-vertex 0.75 0.25 0.0) (gl-vertex 0.75 0.75 0.0) (gl-vertex 0.25 0.75 0.0) ) (gl-flush) (update-the-window-and-check-for-events) 0) |
Note that initialize-a-window-please and update-the-window-and-check-for-events are function calls dependent on the windowing system. Gauche-gl comes with GLUT binding and you can use it to do basic stuff. In the separate package Gauche-gtk, a binding to GtkGLExt is provided, which allows you to do GL rendering inside Gtk widgets.
For the time being, let's focus on the pure GL part.
The mapping of GL call name is straightforward.
The mixed case names in OpenGL C API is expanded to hyphenated name,
e.g. glClearColor
⇒ gl-clear-color
.
OpenGL enums are mapped as is, e.g.
GL_POLYGON
. (Note that Gauche is case-sensitive by default.
Also note the underscore, not hyphen, in constants).
A few convenience macros, such as gl-begin*
, is defined.
There are straight bindings of gl-begin
and gl-end
,
so you can write the drawing part in the same way as in C:
(gl-begin GL_POLYGON) (gl-vertex 0.25 0.25 0.0) (gl-vertex 0.75 0.25 0.0) (gl-vertex 0.75 0.75 0.0) (gl-vertex 0.25 0.75 0.0) (gl-end) |
Actually gl-begin*
macro expands into the above calls.
It's a matter of taste, but the macro version guarantees
begin and end match, and the syntax-aware editor can indent
internal calls accordingly.
You might have noticed that the type suffix in C API is not in Gauche binding. The Scheme function figures out the type of passed arguments and calls appropriate C API. SRFI-4 uniform numeric vectors are used to represent arrays of numbers.
(gl-vertex 1.0 2.0 3.0) ⇒ glVertex3d (gl-vertex '#f32(1.0 2.0)) ⇒ glVertex2fv (gl-vertex '#s32(3 2 5)) ⇒ glVertex3iv |
Generally, passing uniform vectors is much more efficient than giving individual numbers, for the former can eliminate the cost of type checking and unboxing.
Some GL calls can also take gl.math3d
primitive objects
such as vector4f
, point4f
or matrix4f
(See section Vectors and matrices). For example, you can pass
point4f
object to gl-vertex
, vector4f
to
gl-normal
, and matrix4f
to gl-mult-matrix
.
They are efficient since calculations on those types are
defined natively in gl.math3d
, and passing it to GL call
doesn't cost unboxing.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on June, 7 2008 using texi2html 1.78.