Фундації: Представництво тривимірного простору

Перед тим як намальований однопіксельний, двигун 3D повинен мати математичну мову для опису об'єктів в просторі. На підставі вектори (трикомпонентні петли, що представляють позицію, напрямок або колір) і (4×4 масиви, які конвертують перетворення). У C, це, як правило, визначено як прості структури:

  • для точок та векторів.
  • для перетворення матриць, що зберігаються в порядку колон-марі.

Кожен об'єкт складається з трикутників. трикутник визначається трьома вершинами, кожен з позицій і додатково нормально і колір. Складання цих як контигузні масиви (наприклад, для куба) покращує ефективність кешу - критичне розглядається при використанні тисячі обличчя в рамку.

Відеолінія графіки: Від Vertices до Пікселів

Графічний трубопровод – це послідовність етапів, що перетворює дані 3D-пошти на 2D зображення. У базовому програмному забезпеченні, що працює двигуном, ви вручну реалізуєте кожен етап. Основні етапи:

  1. Вертекс – модель застосування, вид та проекційні перетворення.
  2. Растеризація] – перетворення трансформованих трикутників у фрагменти (потенційні пікселів).
  3. Посадка] – обчислення кольору кожного фрагмента на основі освітлення та матеріалу.
  4. Output Merging – змішування фрагментів з буфером каркаса, включаючи тестування глибини.

Апаратно-прискорених двигунів (на базі OpenGL, Vulkan або DirectX) виконують більшість з цих кроків на GPU, але розуміння шляхів програмного забезпечення дає вам глибоке розуміння того, як працює GPU під витяжкою.

Переробка та трансформації Vertex

Кожен верекс починається в / (локальні координати відносно об'єкта). Для його позиціонування в світі, ви наносите / , що кодує переклад, обертання та масштабування. Потім / / ] перетворює світові координати в камерно-релятивні координати (обглядовий простір). Нарешті / Projection matrix ] ] [LLT:8]]

У C функції перетворення виглядають:

  • – повертає матрицю ідентичності.
  • – побудова матриці перекладу.
  • - обертання навколо осі X.
  • – багатошарова матриця 4 × 4 за допомогою вектора 4-елемента (однорідних координат).

Верекс забарвник, еквівалентний програмним забезпеченням, що переносить всі вершини, багатоповерхівки по кожному комбінаційному матрицею, і зберігає результат трансформованого буфера вершин.

Проекція: Перспективна верстка Ортографічна

Проекція контролює, як глибина представлена на екрані. Перспективний проекція робить віддалені об'єкти з'являються меншими, створюючи реалістичність. Його матриця побудована з поля зору, співвідношення сторін, поруч і далеких площин затискання. Класична формула передбачає поділу x і Y компонентів за допомогою z (після матриці багатозастосувань). У C, ви компрате проекційні матриці один раз і повторно його з'ясуєте кожен кадр:

  • – повертає стандартну перспективну матрицю.

Orthographic projection зберігає паралельні лінії і простий, використовується для UI або CAD інструментів. Не передбачається перспективного поділу.

Растризація: Заповнення трикутників

Після проекції у вас є 2D екранні координати (наприклад, піксельні позиції) та значення глибини (з). Растрація переламує кожен трикутник у фрагменти, що охоплюють цілу піксельну координату. Класичний алгоритм сканінлайн перетворення]:

  1. Сортувати три вершини трикутника по y-координаті.
  2. Пройдіть ліву і праву краї, розраховуючи х межі для кожного скандина.
  3. Для кожного пікселя в горизонтальному проміжку розрахуйте глибину фрагмента, переповнюючи трикутником.
  4. глибинний тест: порівняти фрагмент з значенням вже в глибині буфера. Якщо ближче оновити глибинний буфер і скласти колір фрагмента.

Впровадження алгоритму кромочніння ефективно в C вимагає щільної петлі і ретельного використання арифметичної дуги з фіксованою точкою, щоб уникнути плаваючого точкового накладу. Багато хобіста двигуни починаються з брюто-силового підходу (зчеплення кожного пікселя в межі коробки) і пізніше оптимізують з рівняннями краю.

Штани та освітлення

Простий плоско-п'ячений двигун використовує один колір на трикутник, що складається з нормального обличчя і одного джерела світла. Lambertian model дає дифузність інтенсивності: . У C, ви комп'ютерно нормально, як крос продукт двох трикутникових країв (після перетворення вершин до світового простору), потім множать інтенсивність світла за кольором трикутника.

Для отримання глибини, реалізації Гурад тінінг (регулятори вершини, інтерполяті по фрагментам) або Phong shading] (запіксельні норми). Останній вимагає міжпокриття світових позицій і нормалей, потім обчислення освітлення за фрагментом — найдорожче, але різко краще результат.

Будівництво двигуна в C: практичні кроки

Похід побудувати мінімальний двигун 3D з нуля. Мета полягає в тому, щоб надати обертальний куб з навколишньою атмосферою і дифузним освітленням на 640 × 480 пікселів.

Крок 1 - Встановити піксельний буфер

Визначте буфер пам'яті для каркасу і глибини: і . Очистити каркасний буфер чорної і глибини буферу до 1,0 (фармовий площину) кожен каркас.

Крок 2 – Визначення даних сцени

Для куба, шість обличчя (12 трикутників) вимагають 12 × 3 = 36 вершин. Зберігайте їх в масиві струнких з положенням (3 плавок) і кольором (3 плаваючі для RGB). Передефір 8 унікальних кубічних кутів і шести кольорів обличчя. Використовуйте індексний буфер, щоб уникнути пригнічених вершин.

Крок 3 – Трансформація трубопровід

Кожен каркас, компute модель матриці з кута (наприклад, ротація(час)), матриця з фіксованої камери, яка шукає на виході, і матриця проекції. Поєднайте їх в одномісну матрицю МВП: . Перетворіть кожен вершин шляхом розмноження . Потім проведіть перспективу дивізію (divide x,y,z w) для отримання нормалізованих кодових координат (−1 до +1). Карта до координат екрана: , (y inverted). Тримайте NDC з глибиною для тестування.

Крок 4 – Растеризування та гоління

Для кожного трикутника використовуйте скан-лайн метод. Під час пікселя, перепоглинайте глибину і перепоставте атрибут первертекса, як світово-просторове положення (для Фонгу) або норма вершини (для Гуруди). Нанесіть рівняння баранця. Напишіть кінцевий колір до каркасу, якщо проходить випробування глибини.

Крок 5 - дисплей

Використовуйте SDL (Simple DirectMedia Layer) або аналогічну бібліотеку для створення вікна і розмитнення каркаса. Наприклад, з SDL2: , , , потім і кожен кадр.

Цей шлях програмного забезпечення працює на процесорі, тому продуктивність обмежена кількома тисяч трикутників за кадром. Після того, як комфортно, ви можете замінити шар растрової обробки з OpenGL, перевантажуючи важку роботу на GPU при збереженні вашого перетворення та логіки сцени в C.

Оптимальне використання вашого двигуна

Основні можливості для виконання в режимі реального часу:

  • Back-face culling: трикутники, нормалі якого відходять від камери. Зніміть підписану область проєктуованого трикутника (в 2D) або перевірте продукт точки для обличчя нормально з прицілом зору.
  • Frustum culling: Перевірте межі коробки об'єкта на шість площинах вигляду фрусту. Якщо повністю поза, пропустіть весь об'єкт.
  • Фіксований точка арифметичне: Заміна плаваючих точкових операцій з цілою математикою в щільному растрових петлях. Багато генераторів використовують 16.16 фіксовану точку для міжполяризації скан-лінії.
  • Pre-transform cache: Уникайте перетворення того ж вершини кілька разів, перетворюючи всі вершини сітки один раз, після чого за допомогою індексів.
  • Blocked кадр буфер пише: Напишіть пікселики в порядку пам'яті (ліво-праворуч, верхній-низ) для максимальних переглядів кешу.

Ці методи можуть натиснути на програмний рендер від 3–5 к/с до 60 к/с на сцени середньої складності (наприклад, кілька сотень трикутників).

Розширення двигуна

Після того, як існує тверда основа, можна додати функції, які незрівняно:

  • Texture mapping: Store 2D зображень і інтерполяте УФ координати по трикутникам. Впровадження дволінійного фільтрування для гладких результатів.
  • Advanced shading: Додати specular виділити (Blinn-Phong), ambient occlusion або навіть shadow map.
  • Управління активами: Використовуйте дерево або дерево BSP, щоб швидко визначити, які об'єкти видимі.
  • Узаємодія користувача: Ручка клавіатури і введення мишки для орбіти камери або пікажу об'єктів.
  • Pipeline тезування: Проектування системи шейдера: визначення вершин і фрагментів функції як тостерів функції, що дозволяють гнучко здійснювати рендеринг без рекомпіляції.

Ресурси та подальше читання

Щоб поглибити своє розуміння, розгляньте класичні тексти та онлайн-уроки, які надихнули цей двигун:

  • Скретч – Поглиблені пояснення променевого калькуляційного, расстеризації та математики.
  • LearnOpenGL] – Сучасні підручники OpenGL; початок з розділу «Hello Triangle».
  • Вікіпедія: 3D Проекція – формальна математика за перспективою та ортографічними матрами.

Будівля 3D двигуна в C є обрядом проходження для графічних програмістів. Він навчає вас не тільки писати ефективний код, але і як подумати в трьох розмірах і композиційних системах продуктивності. Починайте з одно обертаючим кубом, потім додайте більше трикутників, текстур і, нарешті, від руки його від GPU. Подорож від сировини C до повнофункціонального двигуна розкриває магію за кожним піксельом на екрані.