OpenGL и шейдеры
OpenGL — кроссплатформенный API к GPU. С версии 3.x fixed-function конвейер убран: программист сам пишет шейдеры на GLSL и загружает геометрию в буферы. Окно и ввод OpenGL не создаёт — для этого GLFW или freeglut; расширения — GLEW или загрузчик из GLFW.
C++ + CMake + GLFW + GLEW + GLM + OpenGL 3.3 core — типичный учебный стек для первых проектов.
Низкоуровневый контроль без OpenGL — Vulkan.
В браузере — WebGL / WebGPU (3D-графика и анимация).
OpenGL и шейдеры
Окно и контекст
- Инициализировать GLFW, задать hints (
CORE_PROFILE, версия 3.3). - Создать окно → OpenGL context текущий в потоке.
- Загрузить функции через GLEW (на Windows
OpenGL32.dllдаёт лишь 1.x без loader). - Цикл: события → обновление →
glClear→ отрисовка →swap buffers.
Qt Quick и Widgets могут встраивать OpenGL-виджет — тот же конвейер, другая обвязка (Qt).
Графический конвейер (core profile)
VBO/VAO → Vertex Shader → (tess/geom опционально) → Clipping → Rasterization
→ Fragment Shader → depth/stencil/blend tests → framebuffer
| Этап | Роль |
|---|---|
| Vertex shader | MVP-цепочка, выход gl_Position, varyings (UV, normal) |
| Rasterization | Треугольник → фрагменты, интерполяция varyings |
| Fragment shader | Цвет пикселя: текстуры, освещение (Phong/PBR) |
| Depth test | Z-buffer (Видимость и буфер глубины) |
| Blend | Альфа-смешивание для прозрачности |
★ VAO хранит привязку атрибутов к VBO; ★ VBO — массив вершин на GPU; ★ EBO — индексы для indexed draw.
Минимальный GLSL
Vertex (упрощённо):
#version 330 core
layout(location = 0) in vec3 aPos;
uniform mat4 uMVP;
void main() {
gl_Position = uMVP * vec4(aPos, 1.0);
}
Fragment:
#version 330 core
out vec4 FragColor;
void main() {
FragColor = vec4(1.0, 0.4, 0.2, 1.0);
}
Шейдеры компилируют отдельно, линкуют в program; uniform-переменные передают матрицы и текстуры.
Текстуры, stencil, типовые эффекты
- 2D-текстура + UV из vertex shader → sample в fragment shader.
- Cubemap — окружение для IBL и skybox.
- Stencil buffer — маска для отражений "в зеркале" (нарисовать зеркало в stencil, затем сцену только где stencil = 1).
- Shadow mapping — рендер глубины с точки зрения света, сравнение в основном проходе.
- Normal / bump mapping — сдвиг нормали по карте высот/нормалей без добавления геометрии.
- PBR — metallic/roughness + Cook–Torrance в fragment shader (3D-графика и анимация).
В Blender те же приёмы — ноды и Eevee/Cycles (Blender).
От OpenGL к индустрии
| API | Платформы | Заметка |
|---|---|---|
| OpenGL / GLES | Кросс, macOS legacy, WebGL | Учебный стандарт |
| Direct3D 12 | Windows, Xbox | Игры Microsoft |
| Vulkan | Кросс, Android | Явная память и sync (Vulkan и низкоуровневая графика на C++) |
| Metal | Apple | iOS/macOS native |
| WebGPU | Браузер | Преемник WebGL |
Принципы шейдеров, MVP, depth и PBR переносятся между API; меняются синтаксис и ритуал инициализации.