OpenGL Programming Guide First example
Categories:
Your First Steps into OpenGL Programming: A Basic Example

Dive into the world of computer graphics with OpenGL. This guide walks you through setting up a basic OpenGL program, explaining the core concepts and code structure to render your first visual.
OpenGL (Open Graphics Library) is a powerful, cross-platform API for rendering 2D and 3D vector graphics. It's widely used in game development, CAD, virtual reality, and scientific visualization. This article will guide you through creating a minimal OpenGL application, focusing on the fundamental steps required to get a window open and draw something on the screen. We'll use C++ and a common library like FreeGLUT or GLFW for window management.
Understanding the OpenGL Pipeline
Before writing code, it's crucial to grasp the basic flow of how OpenGL processes data to render an image. The modern OpenGL pipeline is programmable, meaning you write small programs called shaders that run on the GPU. This allows for immense flexibility and performance. The core stages involve defining vertices, transforming them, assembling primitives (like triangles), rasterizing them into fragments (potential pixels), and finally, processing these fragments to determine the final pixel color on the screen.
flowchart TD A[Application] --> B{Vertex Data} B --> C[Vertex Shader] C --> D[Primitive Assembly] D --> E[Geometry Shader (Optional)] E --> F[Rasterization] F --> G[Fragment Shader] G --> H[Per-Fragment Operations] H --> I[Framebuffer / Screen]
Simplified Modern OpenGL Rendering Pipeline
Setting Up Your Development Environment
To begin, you'll need a C++ compiler (like GCC or MSVC), OpenGL development libraries, and a windowing toolkit. FreeGLUT or GLFW are popular choices for handling window creation, input, and context management, as raw OpenGL doesn't provide these functionalities. For this example, we'll assume you have a basic C++ development environment set up and have linked against FreeGLUT or GLFW and the OpenGL libraries.
Your First OpenGL Program: Drawing a Simple Triangle
Let's create a basic program that opens a window and draws a colored triangle. This example will use immediate mode (fixed-function pipeline) for simplicity, which is easier to understand for beginners, though modern OpenGL primarily uses shaders. We'll cover the necessary includes, initialization, display function, and main loop.
#include <GL/freeglut.h>
#include <GL/gl.h>
// Function to draw our scene
void display()
{
glClear(GL_COLOR_BUFFER_BIT); // Clear the color buffer
glBegin(GL_TRIANGLES); // Start drawing triangles
glColor3f(1.0f, 0.0f, 0.0f); // Red color
glVertex2f(-0.5f, -0.5f); // Bottom-left vertex
glColor3f(0.0f, 1.0f, 0.0f); // Green color
glVertex2f(0.5f, -0.5f); // Bottom-right vertex
glColor3f(0.0f, 0.0f, 1.0f); // Blue color
glVertex2f(0.0f, 0.5f); // Top-center vertex
glEnd(); // End drawing triangles
glFlush(); // Ensure all commands are executed
}
// Main function
int main(int argc, char** argv)
{
glutInit(&argc, argv); // Initialize GLUT
glutCreateWindow("My First OpenGL Triangle"); // Create a window
glutDisplayFunc(display); // Register the display callback function
glClearColor(0.2f, 0.2f, 0.2f, 1.0f); // Set background color to dark gray
glutMainLoop(); // Enter the GLUT event processing loop
return 0;
}
A simple OpenGL program using FreeGLUT to draw a colored triangle.
glBegin()
and glEnd()
functions, along with glVertex*()
and glColor*()
, are part of OpenGL's immediate mode. While easy for initial learning, modern OpenGL uses Vertex Buffer Objects (VBOs) and shaders for better performance and flexibility. This example serves as a foundational step.Breaking Down the Code
Let's examine the key components of the example code:
#include <GL/freeglut.h>
and<GL/gl.h>
: These lines include the necessary headers for FreeGLUT (for window management) and the core OpenGL functions.display()
function: This is our rendering callback. GLUT calls this function whenever the window needs to be redrawn.glClear(GL_COLOR_BUFFER_BIT);
: Clears the color buffer, effectively wiping the screen clean with the color set byglClearColor()
.glBegin(GL_TRIANGLES);
andglEnd();
: These delineate a block of code where we define vertices for a primitive (in this case, triangles).glColor3f(R, G, B);
: Sets the current drawing color. The3f
suffix means three float values.glVertex2f(x, y);
: Defines a vertex in 2D space. The coordinates are normalized device coordinates, ranging from -1.0 to 1.0 for the visible area.glFlush();
: Forces all OpenGL commands to be executed immediately, ensuring the drawing appears on screen.
main()
function: The entry point of our program.glutInit(&argc, argv);
: Initializes the GLUT library.glutCreateWindow("My First OpenGL Triangle");
: Creates a window with the given title.glutDisplayFunc(display);
: Registers ourdisplay
function as the callback to be called when the window needs to be drawn.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
: Sets the background color (dark gray in this case) thatglClear()
will use.glutMainLoop();
: Enters the GLUT event processing loop. This function never returns and continuously processes events (like redraw requests, keyboard input, mouse input) until the program exits.
1. Compile the code
Save the code as a .cpp
file (e.g., triangle.cpp
). Compile it using your C++ compiler, linking against OpenGL and FreeGLUT. For GCC/G++ on Linux, this might look like: g++ triangle.cpp -o triangle -lGL -lGLU -lglut
.
2. Run the executable
Execute the compiled program from your terminal: ./triangle
. A new window should appear displaying a colorful triangle against a dark gray background.
3. Experiment with values
Try changing the glColor3f
values to create different color combinations, or modify glVertex2f
coordinates to change the triangle's shape or position. Observe how these changes affect the rendered output.