Graphics Programing Pains
Perm url with updates: http://xahlee.org/3d/graphics_programing_pain.html
Graphics Programing Pains
Xah Lee, 2007-12-29, 2009-06
[this essay is a rambling about programing GUI app and 3D geometry]
I have a problem. I want to do 3D geometry visualization programing, but there is no appropriate tools. (see Requirements For A Visualization Software System For 2020) O, fuck the industry.
GUI Programing Pain
I never had any experience writing a GUI application. (except web/HTML form based ones, which doesn't really count.) About 3 times in different years since 1997, i tried to learn GUI programing thru Java's Swing (Java). But each time i aborted rather even before getting a basic understanding of how to create a menu. Today is another try, and perhaps the furthest i've made. To make a empty window with a menu with no actions attached, requires some fucking 170 lines of java code, and tens of classes and objects with complex relationships. (sample code here:MenuLookDemo.java)
So, i am wondering, is this the general state of affairs for GUI programing, or is it just Java? I asked a bit on freenode irc, and it seems to be java, although i guess programing GUI using any widget toolkits is not gonna be a walk in the park.
I like to work on software projects that are mission critical, or backend engines, so i don't regard GUI apps that much important. Nevertheless, GUI, as its name implies, provides a graphical user interface, and is in fact a element most software needs. In particular, one of my hobby is programing geometric visualization. Imagine viewing and rotating a molecule structure in 3D. Such a software requires a GUI.
So, even knowing it's gonna be a pain, and at this point i'm gonna abandon Java's Swing again because it is intolerable, but i did half-heartedly looked into alternatives of GUI widgets, in part to acquaint myself what's out there, and maybe pave the road to learn a thing or two about how to actually use a widget toolkit to create a menu or button.
Each has various language bindings. I think i might want to start to tinkle with PyGTK.
One thing interesting is that Cairo (graphics) is a recently developed library for drawing vector graphics, and recent version of GTK+ uses it.
3D Programing Pain
Direct3D is Windows only. Since my professional expertise all lies in unix, and basically don't know much about Windows's technologies, so Direct3D is out for me.
Now, i have read about OpenGL a lot since 1994... but basically it is more low-level pain, perhaps a order of magnitude more painful than doing Java Swing. However, if you really want to get down to creating a geometry visualization software that is good quality (namely, fast), OpenGL or similar is a inevitability. (the alternative, of doing projections yourself and paint them to screen, is hackish and way slower)
Given my problem and persistent infatuation with visualization of geometry, i think going down getting familiar with OpenGL stuff is necessary, or strongly advisable. So, i started to read many articles on Wikipedia related to computer graphics, in particular the low level stuff. Here's some random articles or terms i'm learning or read.
Graphics pipeline. This is the most important concept. Basically, a 3D scene is passed to the graphics card, and processed in various stages, to produce a 2D bitmap for the screen.
Here are some general important concepts.
- Scene graph. One of the fundamental concept. Basically the data describing the 3D objects.
- Space partitioning
- Shader (vertex shaders, geometry shaders, pixel shaders)
- Level of detail (programming)
Some concepts at the bitmap stage.
- Z-buffering A method to determine which pixel (of objec) is visible. This approach basically outdates the Painter's algorithm
- Anti-aliasing Woot! all i know about anti-aliasing is in the context of fonts and line drawing. Didn't explicitly know the implementation is so deep.
- Alpha compositing basically for handling transparencies.
- Mipmap basically reducing the computation time by pre-storage of scaled-down bitmaps for surface texture rendering purposes.
- Texture mapping Applying a bitmap to surface, either for the purpose of creating a image on the surface (say a pict on cereal box), but usually for the purpose of faking surface qualities (i.e. a tree bark, fresco wall).
- Bump mapping. A specialized texture mapping technique to simulate uneven surfaces. (say, on a orange)
Some of the free game engines:
Some free physics engines:
Here's some articles related to game development.