WebGL - Геометрия: Пособие для начинающих
Здравствуйте, будущие маэстро WebGL! Я рад быть вашим проводником в этом захватывающем путешеествии в мир геометрии WebGL. Как кто-то, кто teaches компьютерную графику более десяти лет, я могу сказать, что понимание геометрии в WebGL похоже научение рисованию кодом. Это сложно, но очень полезно! Так что натянем рукава и окунемся в это!
Определение必需ой геометрии
Before мы начнем создавать потрясающие 3D-графики, мы должны понять, что такое геометрия в WebGL. По сути, геометрия - это основа всего, что мы видим на экране. Она состоит из точек, линий и форм, которые formed структуру наших 3D-объектов.
Представьте, что вы строите дом из LEGO-кирпичиков. Каждый кирпичик represents точку в 3D-пространстве, и когда вы соединяете эти точки, вы создаете ребра и поверхности. Именно это мы делаем в WebGL, но с кодом вместо пластиковых кирпичиков!
Давайте начнем с простого примера - создание треугольника:
const triangleVertices = [
0.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0
];
Здесь мы определили три точки в 3D-пространстве. Каждая точка представлена тремя числами (x, y, z). Этот массив чисел - это то, что мы будем использовать, чтобы告诉 WebGL, где рисовать наш треугольник.
Buffer Objects
Теперь, когда у нас есть определенная геометрия, мы должны передать эти данные на GPU. Вот где появляются буферные объекты. Представьте буферные объекты как особые контейнеры, которые хранят наши геометрические данные и делают их легко доступными для GPU.
Создание буфера
Создание буфера - наш первый шаг в подготовке нашей геометрии для GPU. Вот как мы это делаем:
const buffer = gl.createBuffer();
Эта строка создает пустой буферный объект. Это как если бы мы подготовили пустую коробку, чтобы заполнить ее нашими LEGO-кирпичиками.
Привязка буфера
After создания буфера, мы должны сказать WebGL, что это тот буфер, с которым мы хотим работать. Мы делаем это, привязывая буфер:
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
Это как если бы мы взяли нашу LEGO-коробку и сказали: "Эй, WebGL, я собираюсь положить в эту коробку несколько кирпичиков!"
Передача данных в буфер
Теперь comes интересная часть - заполнение нашего буфера геометрическими данными:
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW);
Давайте разберем это:
-
gl.bufferData()
- метод, который мы используем для заполнения буфера. -
gl.ARRAY_BUFFER
tells WebGL, что мы работаем с是我们的 текущим привязанным буфером. -
new Float32Array(triangleVertices)
преобразует наш массив JavaScript в типизированный массив (подробнее об этом через мгновение). -
gl.STATIC_DRAW
- подсказка для WebGL о том, как мы планируем использовать эти данные.
Типизированные массивы
Вы можете задаться вопросом, почему мы использовали Float32Array
в предыдущем шаге. Ну, WebGL очень капризен в отношении своих типов данных. Он предпочитает работать с типизированными массивами для эффективности. Типизированные массивы обеспечивают, чтобы каждый фрагмент данных был одного размера и типа.
Вот таблица часто используемых типизированных массивов в WebGL:
Типизированный массив | Описание | Случай использования |
---|---|---|
Float32Array | 32-битные浮点数 | Пositionы вершин, координаты текстур |
Int8Array | 8-битные знаковые целые числа | Малые целые числа |
Uint8Array | 8-битные беззнаковые целые числа | Компоненты цвета |
Int16Array | 16-битные знаковые целые числа | Большие целые числа |
Uint16Array | 16-битные беззнаковые целые числа | Индексы вершин |
Int32Array | 32-битные знаковые целые числа | Очень большие целые числа |
Uint32Array | 32-битные беззнаковые целые числа | Очень большие положительные целые числа |
В нашем случае, мы использовали Float32Array
, потому что наши позиции вершин - это浮点ные числа.
Отвязка буферов
After мы закончили работу с буфером, хорошей практикой является его отвязка:
gl.bindBuffer(gl.ARRAY_BUFFER, null);
Это как если бы мы положили LEGO-коробку обратно на полку. Это предотвращает случайные изменения нашего буфера и поддерживает чистоту состояния WebGL.
И вот оно,朋友们! Мы успешно определили нашу геометрию, создали буфер, наполнили его данными и узнали о типизированных массивах. Это основа создания любого 3D-объекта в WebGL.
Помните, обучение WebGL - это путешеество. Не волнуйтесь, если некоторые концепции сначала кажутся сложными. С практикой вы быстро начнете создавать потрясающие 3D-графики! За годы моего teaching я видел countless студентов, которые перешли от confused BEGINNERS к maestro WebGL. Вы на правильном пути к их ranks!
В следующем уроке мы рассмотрим, как использовать эти буферы для рисования нашей геометрии на экране. Готовьтесь увидеть свой первый WebGL-треугольник ожившим! Пока, счастливого кодирования, и не забывайте делать перерывы и растягивать finger!
Credits: Image by storyset