Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Learning about low-level graphics programming

Tags:

graphics

I'm interesting in learning about the different layers of abstraction available for making graphical applications.

I see a lot of terms thrown around: At the highest level of abstraction, I hear about things like C#, .NET, pyglet and pygame. Further down, I hear about DirectX and OpenGL. Then there's DirectDraw, SDL, the Win32 API, and still other multi-platform libraries like WxWidgets.

How can I get a good sense of where one of these layers ends and where the next one begins? What is the "lowest possible level" way of creating a window in Windows, in C? What about C++? (A code sample would be divine.) What about in X11? Are the Windows implementations of OpenGL and DirectX built on top of the Win32 API? Where can I begin to learn about these things?

There's another question on SO where Programming Windows is suggested. What about for Linux? Is there an equivalent such book?

I'm aware that this is very low-level, and that there are many friendlier tools available, but I would like to at least learn the basics of what's going on beneath the surface. As much as I'd like to begin slinging windows and vectors right off the bat, starting with something like pygame is too high-level for me; I really need to make the full conceptual circuit of how you draw stuff on a computer.

I will certainly appreciate suggestions for books and resources, but I think it would be stupendously cool if the answers to this question filled up with lots of different ways to get to "Hello world" with different approaches to graphics programming. C? C++? Using OpenGL? Using DirectX? On Windows XP? On Ubuntu? Maybe I ask for too much.

like image 449
Max Cantor Avatar asked Oct 25 '08 03:10

Max Cantor


People also ask

How do I become a graphics programmer?

The most important ingredient to being successful at graphics programming is dedication. Often you have to start it as a hobby, and take it as your undergrad focus for a Computer Science degree, AND have written some really awesome little demos, before a (good) company would hire you to do graphics programming work.

Why should I learn graphics programming?

Any programming jobOr going from Processing to graphics shaders is a logical jump. So if you keep programming and trying new things, eventually you build understanding around it and you could get any programming job with enough time and practice.

What is lower level than OpenGL?

The Linux open source drivers for both AMD and Intel go through an low level API called DRI2/DRM; in combination with KMS also called Gallium. MesaGL sits on top of DRI, so in Linux there is actually such a lower than OpenGL level API to the graphics card.

What are graphics in coding?

Graphical Programming Defined The graphical approach to programming allows a computer to process spatial representations in two or more dimensions. In contrast to text-based programming, which uses lines of code, graphical programming replaces text with pictures or symbols of physical things.


1 Answers

The lowest level would be the graphics card's video RAM. When the computer first starts, the graphics card is typically set to the 80x25 character legacy mode.

You can write text with a BIOS provided interrupt at this point. You can also change the foreground and background color from a palette of 16 distinctive colors. You can use access ports/registers to change the display mode. At this point you could say, load a different font into the display memory and still use the 80x25 mode (OS installations usually do this) or you can go ahead and enable VGA/SVGA. It's quite complicated, that's what drivers are for.

Once the card's in the 'higher' mode you'd change what's on screen by accessing the memory mapped to the video card. It's stored horizontally pixel by pixel with some 'dirty regions' of pixels that aren't mapped to screen at the end of each line which you have to compensate for. But yeah, you could copy the pixels of an image in memory directly to the screen.

For things like DirectX, OpenGL. rather than write directly to the screen, commands are sent to the graphics card and it updates its screen automatically. Commands like "Hey you, draw this image I've loaded into the VRAM here, here and here" or "Draw these triangles with this transformation matrix..." take a fraction of the time compared to pixel by pixel . The CPU will thank you.

DirectX/OpenGL is a programmer friendly library for sending those commands to the card with all the supporting functions to help you get it done smoothly. A more direct approach would only be unproductive.

SDL is an abstraction layer so without bothering to read up on it I'd guess it would have different ways of working on each system. On one it might use semi-direct screen writing, another Direct3D, etc. Whatever's fastest as long as the code stays cross-platform..able.

The GDI/GDI+ and XWindow system. They're designed specifically to draw windows. Originally they drew using the pixel-by-pixel method (which was good enough because they'd only have to redraw when a button was pressed or a window moved, etc.) but now they use Direct3D/OpenGL for accelerated drawing (and special effects). Optimizations depend on the versions and implementations of these libraries.

So if you want the most power and speed, DirectX/openGL is the way to go. SDL is certainly useful for getting the most from a cross-platform environment and integrates with OpenGL anyway. The windowing system comes last but don't underestimate it. Especially with the stuff Microsoft's coming up with lately.

like image 132
Yes Fish... Avatar answered Nov 13 '22 08:11

Yes Fish...