Перейти к основному содержимому

OpenGL и шейдеры

C++ / GLSL

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 (13.md).


OpenGL и шейдеры

Окно и контекст

  1. Инициализировать GLFW, задать hints (CORE_PROFILE, версия 3.3).
  2. Создать окно → OpenGL context текущий в потоке.
  3. Загрузить функции через GLEW (на Windows OpenGL32.dll даёт лишь 1.x без loader).
  4. Цикл: события → обновление → 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 shaderMVP-цепочка, выход gl_Position, varyings (UV, normal)
RasterizationТреугольник → фрагменты, интерполяция varyings
Fragment shaderЦвет пикселя: текстуры, освещение (Phong/PBR)
Depth testZ-buffer (17.md)
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 (13.md).

В Blender те же приёмы — ноды и Eevee/Cycles (131.md).


От OpenGL к индустрии

APIПлатформыЗаметка
OpenGL / GLESКросс, macOS legacy, WebGLУчебный стандарт
Direct3D 12Windows, XboxИгры Microsoft
VulkanКросс, AndroidЯвная память и sync (29.md)
MetalAppleiOS/macOS native
WebGPUБраузерПреемник WebGL

Принципы шейдеров, MVP, depth и PBR переносятся между API; меняются синтаксис и ритуал инициализации.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").