WebGL - Основы: Дружественное введение для начинающих

Здравствуйте, будущие маги WebGL! Я рад быть вашим проводником в этом захватывающем путешествии в мир WebGL. Как кто-то, кто преподавал компьютерную графику на протяжении многих лет, я с нетерпением жду возможности поделиться магией WebGL с вами. Не волнуйтесь, если вы новички в программировании - мы начнем с азов и будем постепенно наращивать наши знания. Так что возьмите杯 кофе (или чая, если это ваше дело) и погружайтесь с нами!

WebGL - Basics

Что такое WebGL?

Прежде чем мы углубимся в Details, давайте поймем, что такое WebGL. WebGL (Web Graphics Library) - это мощная JavaScript API, которая позволяет нам создавать потрясающие 3D-графики прямо в наших веб-браузерах. Это как иметь迷你-киностудию у вас под рукой!

Представьте WebGL как мост между вашим веб-браузером и графикой вашего компьютера. Он позволяет нам использовать мощность вашего GPU (Graphics Processing Unit) для рендеринга сложных 3D-сцен с плавной производительностью. Круто, правда?

WebGL - Координатная система

Теперь давайте поговорим о координатной системе WebGL. Представьте, что вы стоите в центре огромного, невидимого 3D-куба. Это в значительной степени то, что и есть координатная система WebGL!

Декартова координатная система

WebGL использует 3D-декартову координатную систему. Она похожа на 2D-систему, которую вы можете изучить на уроках математики, но с дополнительнойницей:

  • X-ось: Горизонтальная (слева направо)
  • Y-ось: Вертикальная (снизу вверх)
  • Z-ось: Глубина (сзади вперед)

Вот простой пример, чтобы помочь вам visualize это:

// Определите вершину (точку в 3D-пространстве)
var vertex = [
0.5,  // X-координата
0.7,  // Y-координата
0.0   // Z-координата
];

В этом примере мы определяем точку, которая слегка справа (0.5) и выше (0.7) от центра, и прямо на поверхности экрана (0.0).

Промежуточное пространство

Одна особенность WebGL заключается в том, что он использует особый диапазон координат, называемый "промежуточным пространством". Все координаты должны находиться между -1.0 и 1.0 на каждой оси. Anything outside this range gets "clipped" (не рисуется).

// Точка в右上ом углу промежуточного пространства
var cornerPoint = [1.0, 1.0, 0.0];

// Точка, которая будет обрезана (не видна)
var clippedPoint = [1.5, 0.5, 0.0];

Графика WebGL

Теперь, когда мы понимаем координатную систему, давайте поговорим о том, как именно WebGL рисует вещи.

Прimitives

WebGL рисует все с помощью простых фигур, называемых примитивами.有三種主要类型:

  1. Точки
  2. Линии
  3. Треугольники

Вот таблица, резюмирующая эти примитивы:

Примитив Описание Случай использования
Точки Единичные пиксели Эффекты частиц, звезды
Линии Прямые линии между точками Рамки, графики
Треугольники Фигуры с тремя точками Большинство 3D-моделей, рельеф

Давайте посмотрим, как мы можем определить простой треугольник:

var triangleVertices = [
0.0,  0.5,  0.0,  // Верхняя точка
-0.5, -0.5,  0.0,  // Левая нижняя точка
0.5, -0.5,  0.0   // Правая нижняя точка
];

Этот код определяет три точки треугольника. Каждая точка представлена тремя числами (x, y, z).

Буферы

Чтобы на самом деле получить наш треугольник на экране, нам нужно использовать что-то called a buffer. Представьте буфер как контейнер, который хранит наши вершины данные и отправляет их на GPU.

Вот как мы можем создать и заполнить буфер:

// Создайте буфер
var buffer = gl.createBuffer();

// Привяжите буфер (сделайте его активным)
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);

// Заполните буфер данными треугольника
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW);

Не волнуйтесь, если это пока выглядит немного запутанно. Мы разберем это более подробно по мере продвижения!

Шейдерные программы

Теперь мы подошли к真的很 увлекательной части: шейдеры! Шейдеры - это особые программы, которые работают на вашем GPU. Они как крошечные фабрики, обрабатывающие каждую вершину и пиксель вашей 3D-сцены.

Типы шейдеров

В WebGL есть два основных типа шейдеров:

  1. Вершинные шейдеры: Обрабатывают каждую вершину (точку) в вашей 3D-сцене
  2. Фрагментные шейдеры: Определяют цвет каждого пикселя

Вот простой пример каждого:

// Вершинный шейдер
attribute vec4 a_position;

void main() {
gl_Position = a_position;
}

// Фрагментный шейдер
precision mediump float;

void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);  // Ярко-красный цвет
}

Вершинный шейдер принимает каждую точку (вершину) и решает, где она должна быть на экране. Фрагментный шейдер затем закрашивает все пиксели между этими точками.

Компиляция и liên kết шейдеров

Чтобы использовать наши шейдеры, нам нужно скомпилировать их и связать их в программу:

// Создайте шейдерную программу
var program = gl.createProgram();

// Привяжите и скомпилируйте шейдеры
var vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
var fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);

// Свяжите программу
gl.linkProgram(program);

Этот процесс похож на компиляцию и связь обычной программы, но он происходит на GPU!

Переменные OpenGL ES SL

Наконец, давайте поговорим о некоторых специальных переменных, используемых в Языке shading OpenGL ES (язык, на котором написаны наши шейдеры).

Атрибуты

Атрибуты - это входные переменные, используемые в вершинных шейдерах. Они обычно содержат данные о каждой вершине, такие как положение или цвет.

attribute vec4 a_position;

Униформы

Униформы - это глобальные переменные, которые одинаковы для всех вершин и фрагментов. Они很适合 для таких вещей, как матрицы преобразования или информация о освещении.

uniform mat4 u_modelViewMatrix;

Переменные

Переменные - это переменные, передающие данные от вершинного шейдера к фрагментному шейдеру. Они интерполируются между вершинами.

varying vec4 v_color;

Вот таблица, резюмирующая эти типы переменных:

Тип переменной Используется в Назначение
Атрибут Вершинный шейдер Входные данные для каждой вершины
Униформ Оба Глобальные данные
Переменная Оба Данные, передаваемые от вершинного к фрагментному шейдеру

И вот и все! Мы рассмотрели основы WebGL, от координат до шейдеров. Помните, что обучение WebGL похоже на обучение рисованию - это требует практики и терпения. Не отчаивайтесь, если все не сложится сразу. Продолжайте экспериментировать, и вскоре вы начнете создавать потрясающие 3D-графики в вашем браузере!

Счастливого кодирования, будущие мастера WebGL!

Credits: Image by storyset