Sign in Join
Wiki copytemporary

OpenGL: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11OpenGL (**Open** **G**raphics **L**ibrary) is a cross-platform API for producing 3D computer graphics. Most modern video cards provide hardware accelerated OpenGL support, wich makes OpenGL a good solution for writing advanced graphics software.
22
33## OpenGL units in Free Pascal
44
55The Free Pascal OpenGL interface consists of the following units:
66
77- **gl**: This unit contains the main functionality such as drawing polygons, applying transformations, setting colors and materials,... Procedures always start with the preposition "gl".
88- **glu**: This unit contains OpenGL utils. Although it has some useful functions, this unit is not necessary as you can implement all glu Procedures with the functionality of the gl unit. Procedures always start with the preposition "glu".
99- **glext**: Vendors can provide additional functionality through extensions. Use this unit to use these extensions.
1010 The functionality specific to higher OpenGL versions (1.2 and later) is available in this unit as well. Initializing this functionality is similar to initializing normal OpenGL extensions: just call Load_GL_version_X_Y function. If your OpenGL library version is older than X.Y, Load_GL_version_X_Y will return false.
1111- **glut**: This unit provides functionality for creating an OpenGL window. Although this is a cross-platform unit, most Windows operating systems don't have a glut dll by default.
1212- **glx**: glx provides functionality to set up an OpenGL window in an X Window system. Procedures always start with the preposition "glx". Obviously, you cannot use this unit on non-X Window systems such as Windows.
1313
1414## OpenGL units in Lazarus
1515
1616Lazarus includes a TOpenGLControl - a LCL control with an OpenGL context. The Lazarus package LazOpenGLContext can be found in lazarus/components/opengl/lazopenglcontext.lpk. An example can be found in lazarus/examples/openglcontrol/openglcontrol_demo.lpi.
1717
1818If you want to modify TOpenGLControl implementation, for example to add new properties like ColorBits and AuxBuffers, see [[Extending TOpenGLControl]].
1919
2020## Third party OpenGL units
2121
2222- [[GLScene]] is a Lazarus package with lots of extra features for OpenGL applications.
2323- [[Castle Game Engine]] allows you to navigate and render 3D worlds (in VRML, X3D and other 3D formats).
2424
2525## Tutorials
2626
2727- [[OpenGL Tutorial]]
2828- [OpenGL Core Tutorials](https://github.com/neurolabusc/OpenGLCoreTutorials)
2929
3030## Tutorial OpenGL 3.3 ( modern OpenGL )
3131
3232- [Lazarus OpenGL 3.3 - Tutorial](https://wiki.delphigl.com/index.php/Lazarus_-_OpenGL_3.3_Tutorial)- (deutsch) (extern)
3333- [Lazarus OpenGL 3.3 - Tutorial](https://github.com/sechshelme/Lazarus-OpenGL-3.3-Tutorial/blob/master/wiki.md)- (deutsch) (extern) (github)
3434
3535## Q/A using OpenGL binding
3636
3737**Q: I don't understand why the ARB version does not work. AFAIK it has the same entry points as the core functionality and OpenGL versions are required to support the ARB version of functions even if the non ARB version is in the core now.**
3838
3939A: No. OpenGL doesn't have to support the extension entry points, even when it supports the same functionality in core already. Vendor is free to remove the extensions, and support only the "core" functions.
4040
4141Also, sometimes when functionality is promoted from ARB extension into core it's slightly changed (although in 99% cases it stays the same). Example is the GLSL shaders, that expose (very slightly) different API through ARB extensions and through core 2.0 specification.
4242
4343Basically, what is exposed through extensions is completely orthogonal to what is exposed through core functionality, so they should be initialized separately. In particular cases, you can make tricks like
4444
4545``` pascal
4646if glIsBufferARB = nil then glIsBufferARB := @glIsBuffer;
4747```
4848
4949but this should be left to the final programmer that knows that "ARB_vertex_buffer_object" behavior is identical to how it works in core.
5050
5151**Q: When I try to use the gluTessCallback function from the glu unit, either the compiler complains or I get a segmentation fault when I try to run my program. How can I get it to work properly?**
5252
5353A: The gluTessCallback function is defined in the following way in the **glu** unit:
5454
5555``` pascal
5656{$IFDEF Windows}
5757 {$DEFINE extdecl := stdcall}
5858{$ELSE}
5959 {$DEFINE extdecl := cdecl}
6060{$ENDIF}
6161
6262gluTessCallback: procedure(tess: PGLUtesselator; which: GLenum; fn: TCallBack); extdecl;
6363```
6464
65-<b>Windows note:</b>A common problem is that the calling convention of the glu functions seems to vary in several different GLUT DLLs builds for windows. In some it is stdcall, in some cdecl. The most used one seems to be stdcall.
65+Windows note:A common problem is that the calling convention of the glu functions seems to vary in several different GLUT DLLs builds for windows. In some it is stdcall, in some cdecl. The most used one seems to be stdcall.
6666
6767You should define your [[callback]] functions like so:
6868
6969``` pascal
7070procedure MyTessBegin(which: GLEnum);
7171{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
7272begin
7373 glBegin(which);
7474end;
7575
7676procedure MyTessEnd;
7777{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
7878begin
7979 glEnd(); // The () is required
8080end;
8181
8282procedure MyTessVertex(data: Pointer);
8383{$IFDEF Windows} stdcall; {$else} cdecl; {$endif}
8484begin
8585 glVertex3dv(PGLDouble(data));
8686end;
8787```
8888
8989Note the cdecl/stdcall modifiers; they are required. You then call gluTessCallback in the following manner:
9090
9191``` pascal
9292gluTessCallback(tess, GLU_TESS_BEGIN, TCallBack(@MyTessBegin));
9393gluTessCallback(tess, GLU_TESS_END, TCallBack(@MyTessEnd));
9494gluTessCallback(tess, GLU_TESS_VERTEX, TCallBack(@MyTessVertex));
9595```
9696
9797Make sure you cast the pointer to your callback function to the TCallBack type, as shown above.
9898
9999Alternatively, if you want to refer to the OpenGL functions directly, use the following calling convention:
100100
101101``` pascal
102102gluTessCallback(tess, GLU_TESS_BEGIN, TCallBack(glBegin));
103103gluTessCallback(tess, GLU_TESS_END, TCallBack(glEnd));
104104gluTessCallback(tess, GLU_TESS_VERTEX, TCallBack(glVertex3dv));
105105```
106106
107107Finally, [here](http://www.ludicity.org/files/tess_demo.pp) is source code for a simple tessellation demo (uses glut).
108108
109109## See also
110110
111111- [[Vulkan]] is a new low-level Graphics API intended to replace OpenGL.
112112
113113---
114114*From the Free Pascal wiki, page "OpenGL", as it stood on 2022-08-09 after a change by Mathias, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history