Graphics Programing Pains

Perm url with updates:

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

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.

It seems to me, the most popular free GUI widget out there are: GTK, Qt (toolkit), Tk (framework).

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.

The following apps i'm familiar with uses Qt: KDE (linux desktop), Linux version of Mathematica, Google Earth, Opera (web browser), Skype, TeamSpeak.

3D Programing Pain

Ok, that's about the GUI bit. But what about geometry visualization programing bit? The answer, is pretty much OpenGL (Mesa 3D), Direct3D.

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.

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)

3D Engines

... it seems to me that there are no high-level graphics engines. Fahrenheit graphics API and QuickDraw3D are supposed to be the one but went no where.

Some of the free game engines:

This seems to be the best: O3D for my needs. It uses a highlevel lang JavaScript, so i don't have to worry about low-level graphics fuck. It accesses GPU transparently, so i don't have to worry about it. It runs in browser, which is what i need for my visualization apps. And it is in the position to be standardized as web 3D tech. The downside is that this will be few years to come.

Some free physics engines:

Game Development

Here's some articles related to game development.

Popular posts from this blog

11 Years of Writing About Emacs

does md5 creates more randomness?

Google Code shutting down, future of ErgoEmacs