Click here to Skip to main content
11,709,536 members (57,293 online)
Click here to Skip to main content

Learning Modern OpenGL

, 19 Jun 2015 CPOL 94.9K 162
Rate this:
Please Sign up or sign in to vote.
A little guide about modern OpenGL and why it gives us so much value.
Shaders + Cube Env Map + Phong Lighting
Shaders + Cube Env Map + Phong Lighting

Introduction

Ok... so you want to learn modern OpenGL. Great! But what does it really mean and what options are available? Do you have to buy expensive books about this technology, or maybe some basic online tutorials are enough?

In this article, I will try to answer some of the questions above and create a guide to a wonderful world of graphics programming using OpenGL.

Let us start!

The plan:

Why Modern?

The first question I would like to answer is why there is a term called 'modern OpenGL'. Is there 'old OpenGL ' as well?

Basically modern means "using programmable graphics pipeline", old means "fixed pipeline".

What is the difference? This is quite a broad topic, but for now I think it is good to know that fixed pipeline was like a black box. You inserted the vertex data in the front (at the input) and you got triangles written to the framebuffer (screen) at the end. You could of course tweak this box to your needs but at some point, it was not enough.

Programmable pipeline is more like a white, transparent box where not only you put input data and wait for the result, but you can insert/change internal mechanisms as well. There is a general form of the pipeline, but a lot of parts are fully controlled by you - thanks to shaders.

Shader is a little program that can compute various things and is run on the GPU. It can transform vertices, calculate color of fragments, delete or add more triangles and even more.

To illustrate this idea, I prepared two images:

Idea of a fixed graphics pipeline

Idea of a programmable graphics pipeline

Although the images above are very very simplified, they show that programmable pipeline is much more flexible and more control is in the hands of a programmer. Thanks to shaders, one can create a lot of graphics effects that was not possible with fixed pipeline.

Currently, with new releases of graphics API (like OpenGL or DirectX), we get more and more control over the GPU. If we look at modern games' engines, we will see that great parts of it are run completely on GPU. Thus is it important to learn the modern way.

OpenGL Major Versions

Version
Important changes
1.1 - March 1997

Fixed pipeline! Note that the version 1.0 was released in 1992.

The latest 1.x version is 1.5 from July 2003 (includes, for instance, VBO and occlusion queries).

2.0 - September 2004

OpenGL Shading Language officially in the standard. Pixel buffer objects, sRGB.

Version 2.1 (July 2006) matches DirectX 9.0c.

OpenGL 2.0/2.1 is a safe point for targeting wide range of older devices (and still one can use shaders)

3.0 - August 2008

Deprecated features list, Frame buffer objects, floating point textures, transform feedback, Core Profile, Geometry shaders, synchronization objects.

OpenGL 3.3 (March 2010) can be compared to DX 10

4.0 - March 2010

Tesselation shaders, draw indirect, ES2 compatibility, program binaries, separate shaders objects, Compute shaders.

OpenGL 4.5 (August 2014) can be compared to DX 11.1 or even supersede it.

What You Should Learn?

I suggest the following topics for the beginning:

  • General knowledge about the computer graphics
  • Platform differences (PC vs Mobile vs Web vs Console)
  • Graphics Pipeline - steps
  • 3D Math - matrices, vectors, projections
  • Camera models
  • Shaders (Vertex and Fragment)
  • Texture projection
  • Basics of Buffers
  • Basic lighting models

Then:

  • Shaders (Geometry, Tessellation, Compute)
  • Advanced memory management with buffers
  • Shadows
  • Global Illumination
  • General Computing on GPU (OpenCL, CUDA, Compute shaders)
  • ...

I left the second list unfinished on purpose. By the time you reach these points, you will definitely have a more clarified perspective on what you want to achieve and how to get where you want.

Where to Start?

When we understand our motivation, we are able to start learning. Sometimes it is quite a hard task though! There are plenty of available resources so a person can be lost and lose his/her initial passion.

I suggest starting with a good beginner level book. One of the best is OpenGL Superbible. This was my first book about graphics programming. At that time, I had the first edition! Now we almost have the 7th (scheduled for August 2015)

The Structure

  • Basics: First triangle, the graphics pipeline, math, buffers, shaders
  • Details: Vertex, Primitive and Fragment Processing, the framebuffer, compute shaders
  • Techniques: Lighting, shadows, cell shading, performance
  • Advanced techniques: compute shaders, pipeline monitoring, loading, and arbitrating access to data, artistic and non-photorealistic effects.
  • Platform specificschapters:, give a high (and low) level overview about OpenGL usage. We can find it not only in desktop platforms (among various operating systems), but even inmobile (OpenGL ES 2.0 and 3.0) and Web (WebGL in HTML5).
  • Upcoming 7th edition will even contain description about AZDO techniques, debugging methods, and, what's the most important, will target opengl 4.4 and 4.5. 

The book gives all the information needed to start and even become quite proficient with OpenGL. The book is both for beginners but also for people very familiar with graphics APIs. as you can see, there are basic chapters, as well as very advanced topics. The writing style is great and no one should have problems with understanding it. The size is around 1000 pages. I guarantee that you'll be often returning to the content of this amazing book.

It is also worth mentioning that there is a lot of online content that can help you. One of the best available tutorials about modern OpenGL (3.3+) comes from Jason L. McKesson in his arcsynthesis tutorials. Another good site is open.gl and lighthouse3d core and also learnopengl.com.

Additionally, if you want to get even more graphics theory, you can take a look at those two 'core' books:

Where to Continue?

Normal Mapping with GLSL

When you have the base and know how to use OpenGL, then you can choose in what area you want to go.

Some time ago, a person would usually go into rendering engine development - meaning more graphics effects. But today, we also have web and mobile apps so your focus can be different.

For 'normal' graphics development, I suggest investing some money in two books that appeared recently - two cookbooks actually!

One of them is OpenGL 4 Shading Language Cookbook and the second one is OpenGL Development Cookbook.

Cookbooks

The idea of programming recipes was quite new to me, but I liked it from the beginning. In both mentioned books, there are lots of different sub-chapters that could be read almost in any order. We usually start with some simpler examples and move towards advanced ones, but still the structure is more loose as with 'common' programming books.

OpenGL 4 Shading Language is a great resource for learning almost the newest version of OpenGL - 4.3. It was refreshed recently and the content got even better. We have the following topics covered:

  • The first two chapters introduce to GLSL and modern OpenGL
  • Another two about Lighting and Texture usage (for instance, immutable textures!)
  • Chapter 5 about image processing and screen space effects (like blur and hdr)
  • Then there is a chapter about tesselation and geometry shaders
  • Chapter 7 covers Shadows techniques
  • Two others describe Noise and Particle animations
  • Then, the last one touches on Compute shaders

Those topics create a very decent base for any graphics programmer.

The second book - OpenGL Development Cookbook - has a similar style as the first one. It uses OpenGL 3.3 - so a bit older, but still valid. The book describes similar areas: introduction to OpenGL, GLSL, lighting, shadows... but examples are different than in the first book. You can compare examples and get some new perspective and coding techniques.

What is important, OpenGL Development Cookbook adds some other valuable chapters to our graphics knowledge bag:

  • Volume rendering
  • Global illumination
  • 3D Mesh file formats
  • Animation systems and physics

All in all, you could treat both of those books as one pack. BTW: you can read my full review of OpenGL Development Cookbook in a separate codeproject article.

Those two cookbooks have great value for me because they fill a niche among graphics programming books. At one side, we have introductory level books like SuberBible, on the other side there are more 'hardcore' books like GPU Pro or ShaderX (and recent OpenGL Insights). The cookbooks fall in the middle and are great resources for anyone with some good OpenGL knowledge who wants to go further.

Is C++ Always Needed?

As you have probably noticed, all of the mentioned books and websites used C++ as a language for code samples. C++ seems to be the most popular choice in this area. But if you know other languages, you are not doomed!

OpenGL is only API and there are lots of different language bindings.

So:

  • For Java, take a look at: Java™ Binding for the OpenGL® API or LWJGL
    • BTW: LWJGL was used by Minecraft
    • Additionally, most Android Apps use its Java based SDK to render graphics using OpenGL ES.
  • For mobile development (and also HTML5), take a look at libgdx - it is a cross platform game and visualization development framework, based on OpenGL ES 2.0 and 3.0. Language: Java
  • For C# (or Visual Basic) - .NET platform - look at openTK
  • For JavaScript, just use WebGL
  • Additionally for other languages, go here - opengl wiki pages

It is worth noticing that no matter what programming language you chose, the graphics theory is the same. So if you know how to make a graphics effect in one language, then it should be relatively easy to do it similarly in some different language.

The Hardware

Currently (December 2014, latest drivers) most of recent desktop GPUs will support OpenGL 4.* or at least 3.*.

Below you can find a quick summary:

GPU
Supported OpenGL Version
NVidia GeForce 6 and 7 Series
OpenGL 2.1
Tesla: NVidia GeForce 8, 9  100, 200, 300 Series
OpenGL 3.3
Fermi: NVidia GeForce 400, 500 Series
OpenGL 4.5
Kepler and Maxwell: NVidia GeForce 600, 700 800M, 900 Series
OpenGL 4.5
AMD Radeon R300, R400, R500,
OpenGL 2.0
AMD Radeon R600 (HD2000, HD3000), R700 (HD4000)
OpenGL 3.3
AMD Evergreen (HD5000)
OpenGL 4.4
AMD * Islands (HD6000, HD7000 and HD8000)
OpenGL 4.4
AMD Volcanic Islands (R7 and R9) and newer
OpenGL 4.4
Intel(R) HD Graphics 2000/3000 (Sandy Bridge)
OpenGL 3.1
Intel(R) HD Graphics 2500/4000 (Ivy Bridge)
OpenGL 4.0
Intel(R) HD Graphics 4400/4600/5000 (Haswell)
OpenGL 4.3

If you want some more details take a look at this wonderful OpenGL Hardware Database

AZDO

Some time ago (at GDC 2014) there was a great presentation delivered about achieving even more performance with OpenGL. This whole set of ideas is called AZDO - "Approaching Zero Driver Overhead". As the name suggests this approach focuses on minimalizm the driver work. Very often gpu has a lot of available power, but it has to wait for the driver to finish some work.

Short summary of techniques:

  • How to update buffers so that they do not create stalls in the pipeline (fe persistent_mapped_buffer, orphaning, multi buffering)
  • explicit synchronization (fences, locking)
  • minimize number of draw calls (fe. draw indirect, batches)
  • packing textures into arrays for faster access, using bindless textures , sparse textures

AZDO is complicated but powerful. It can unlock a lot of power in your engine. This is also a good starting point for new graphics API like do DirectX 12 or Vulkan - in which the driver will be minimalistic and all the work will be dependent on clients(programmers).

Resources and Links

Conclusion

Water on GPU + Normal Mapping Source: Simple Water Simulation

In this article, I tried to give you enough resources to start and make good progress with graphics programming. OpenGL is a very popular technology right now. A lot of new possibilities will be available for anyone with decent graphics API experience. You cannot only make AAA game engines, but also move into web or mobile development.

Have a nice journey with Modern OpenGL!

You can also see more about OpenGL at Bartek's blog: http://www.bfilipek.com/.

History

  • 15 May 2015 - improved OpenGL Superbible description, added information about upcomming 7th edition.
  • 23 April 2015 - added section describing AZDO - new set of techniques that give even more performance for OpenGL apps.
  • 25 February 2015 - Added TOC and updated the hardware table: Intel now supports GL 4.3 (Haswell) + NVidia supports 4.5
  • 18 June 2014 - Updates in the hardware table, Radeons HD 5000+ support GL 4.4
  • 30 May 2014 - Added the hardware section
  • 28 May 2014 - Extended OpenGL version table, added some more links
  • 14 May 2014 - Initial version

 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Bartlomiej Filipek
Software Developer
Poland Poland
Software developer interested in creating great code and passionate about teaching.

Technologies I use(d): C++, C#, JavaScript, OpenGL, GLSL, DirectX, OpenCL, CUDA, Windows Api, MFC, Visual Studio and even HTML and CSS.

See my programming blog: www.bfilipek.com

You may also be interested in...

Comments and Discussions

 
GeneralMy vote of 5 Pin
MrShadowGames26-Jun-15 1:35
professionalMrShadowGames26-Jun-15 1:35 
QuestionVulkan Pin
ed welch19-Jun-15 13:06
membered welch19-Jun-15 13:06 
AnswerRe: Vulkan Pin
Bartlomiej Filipek21-Jun-15 20:36
memberBartlomiej Filipek21-Jun-15 20:36 
GeneralRe: Vulkan Pin
ed welch22-Jun-15 0:07
membered welch22-Jun-15 0:07 
GeneralRe: Vulkan Pin
Bartlomiej Filipek22-Jun-15 0:13
memberBartlomiej Filipek22-Jun-15 0:13 
GeneralMy vote of 5 Pin
Tim Verbruggenz18-Jun-15 22:59
memberTim Verbruggenz18-Jun-15 22:59 
GeneralRe: My vote of 5 Pin
Bartlomiej Filipek18-Jun-15 23:46
memberBartlomiej Filipek18-Jun-15 23:46 
QuestionExcellent Pin
Andres Cassagnes25-Apr-15 10:16
memberAndres Cassagnes25-Apr-15 10:16 
AnswerRe: Excellent Pin
Bartlomiej Filipek27-Apr-15 3:19
memberBartlomiej Filipek27-Apr-15 3:19 
GeneralMy vote of 5 Pin
gameengineer21-Jan-15 5:33
membergameengineer21-Jan-15 5:33 
QuestionUsing old OpenGL Pin
AORD4-Dec-14 8:16
memberAORD4-Dec-14 8:16 
AnswerRe: Using old OpenGL Pin
Bartlomiej Filipek4-Dec-14 20:39
memberBartlomiej Filipek4-Dec-14 20:39 
GeneralRe: Using old OpenGL Pin
AORD5-Dec-14 7:13
memberAORD5-Dec-14 7:13 
GeneralRe: Using old OpenGL Pin
Bartlomiej Filipek5-Dec-14 7:16
memberBartlomiej Filipek5-Dec-14 7:16 
QuestionThanks Bartlomiej Pin
mashooha18-May-14 5:12
membermashooha18-May-14 5:12 
AnswerRe: Thanks Bartlomiej Pin
Bartlomiej Filipek18-May-14 5:36
memberBartlomiej Filipek18-May-14 5:36 
QuestionWhich OpenGL version to target for DX9.x graphics card? Pin
Wong Shao Voon13-May-14 22:04
professionalWong Shao Voon13-May-14 22:04 
AnswerRe: Which OpenGL version to target for DX9.x graphics card? Pin
Bartlomiej Filipek13-May-14 22:55
memberBartlomiej Filipek13-May-14 22:55 
GeneralRe: Which OpenGL version to target for DX9.x graphics card? Pin
ITISAG18-Jun-14 5:37
memberITISAG18-Jun-14 5:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150819.1 | Last Updated 19 Jun 2015
Article Copyright 2014 by Bartlomiej Filipek
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid