В прошлых заметках речь шла о пространственных преобразованиях и соответствующих матрицах. Преобразования производятся над вершинами 3-хмерного объекта (модели) путем умножения координат вершин на матрицы. Заниматься этим умножением вершин на матрицы должен видеопроцессор, то есть шейдеры, а именно vertex shader. Почему именно видеопроцессор? Потому что вершин очень много, а у видеопроцессора много ядер, поэтому он может выполнить преобразование большого количества вершин гораздо эффективнее, чем это сделает CPU. Когда производится конкретное пространственное преобразование над некоторой моделью, все вершины этой модели умножаются на Читать дальше …
Метка: OpenGL
Опыт изучения OpenGL — Часть 8 — Vector maths API
В прошлой заметке я закончил теоретическую часть рассказа про пространственные преобразования в компьютерной графике. Теперь хочу сказать два слова про программирование всего этого на C++. Vector & Matrix Было довольно очевидно, из чего должен состоять API для векторной алгебры в моем проекте. Это должны были быть два класса: Vector и Matrix. Элементами вектора могут быть числа различных типов (скажем, int, float, double и пр.), поэтому очевидно, что классы Vector и Matrix должны были быть шаблонными (тип элемента матрицы/вектора должен быть Читать дальше …
Опыт изучения OpenGL — Часть 7 — Пространственные преобразования (продолжение)
В прошлой заметке мы рассмотрели преобразование перспективной проекции. В этой рассмотрим еще несколько вопросов, которые касаются в основном преобразований в пространствах model, world и camera. Смена базиса Для начала поговорим переходе от одной системы координат к другой. В 3-хмерном евклидовом пространстве существует т. н. базис, который состоит из трех векторов. Базис — это набор векторов, такой, что любой вектор можно представить в виде линейной комбинации базисных векторов. Коэффициенты в этой линейной комбинации называются координатами. Пусть есть две системы координат K Читать дальше …
Опыт изучения OpenGL — Часть 7 — Пространственные преобразования. Перспективная проекция.
В предыдущих заметках мы рисовали плоский треугольник на плоском экране. Трехмерный мир оказывается более разнообразен, чем плоский экран. Тут есть много о чем поговорить. Литература Jason McKesson — Learning Modern 3D Graphics Programming. Jason Gregory — Game Engine Architecture (2nd Edition). Пространства в 3d-играх World Space В трехмерных программах используется несколько координатных пространств. Одно из них называется мир (world space). В мире находятся объекты (в компьютерной игре это — персонажи, окружение и пр.) и камера. И камера, и объекты могут Читать дальше …
Опыт изучения OpenGL — Часть 6 — Улучшаем программу рисования треугольника
В прошлой заметке мы нарисовали треугольник с использованием практически голого OpenGL. Начнем теперь видоизменять программу. Цель — сделать ее более простой для понимания и менее подверженной ошибкам. Предпосылки для написания своего фреймворка У приведенной в прошлой заметке программы рисования треугольника есть следующие потенциальные возможности для улучшения: Очень много вызовов всяких функций, выполняющих очень мелкие операции в рамках некой сравнительно крупной задачи. Например, чтобы скомпоновать шейдерную программу, надо вызвать функции glCreateProgram, glAttachShader, glLinkProgram, glDetachShader. Ясно, что в подобных случаях все эти Читать дальше …
Опыт изучения OpenGL — Часть 5 — Рисуем треугольник
В предыдущих заметках мы провели всю необходимую подготовку для того, чтобы начать рисовать. Рисовать начнем с треугольника (так поступают авторы большинства книжек по OpenGL). На примере рисования треугольника мы обсудим ряд базовых концепций компьютерной графики. Пока речь не пойдет о трехмерном пространстве, наш треугольник не будет поворачиваться, и на него нельзя будет взглянуть под произвольным углом. Литература Настоятельно рекомендую вам главы из нижеследующих книг перед чтением этой заметки (или после чтения): Jason McKesson — Learning Modern 3D Graphics Programming. — Читать дальше …
Опыт изучения OpenGL — Часть 4 — Класс engine::ProgramBase
Я продолжаю рассказывать о написанном мною рисовательном API на базе OpenGL, размещенном в открытом репозитории на хостинге BitBucket. К сожалению, написание программы с помощью OpenGL требует существенной предварительной артподготовки в виде Загрузки функций OpenGL (инициализации библиотеки GLEW) Создания окна Создания контекста OpenGL В сегодняшней заметке я освещу класс engine::ProgramBase, который собирает все перечисленные этапы воедино, и в следующих заметках перейду непосредственно к рисованию. Задачи класса ProgramBase Все программы, которые что-то рисуют при помощи OpenGL, как оказалось, имеют ряд общих черт. Читать дальше …
Опыт изучения OpenGL — Часть 3 — Создание контекста рисования
В предыдущих двух заметках я рассказал о том, как загрузить функции OpenGL (проинициализировать библиотеку GLEW) и как создать окно, в котором мы будем рисовать. Но для рисования нам потребуется так называемый OpenGL context — «an object that holds all of OpenGL» — он уже упоминался в первой заметке. Повторим вкратце основные факты о контексте OpenGL: Контекст обладает состоянием. Его состояние определяет, что будет нарисовано на экране. Изменить (повлиять на) это состояние могут только функции API OpenGL. Т. е. контекст можно Читать дальше …
Опыт изучения OpenGL — Часть 2 — Окно
В прошлой заметке я начал рассказывать про свой опыт изучения OpenGL и остановился на том, что проинициализировал библиотеку GLEW, которая загружает все функции API OpenGL. Чтобы начать рисовать что-либо при помощи OpenGL, нам нужно то, на чем можно рисовать, а именно — окно. Ему и посвящена настоящая заметка. Работа окна имеет непосредственное отношение к используемой нами операционной системе, в моем случае — Windows. Поэтому в коде активно используется WinAPI. Исходный код проекта по изучению OpenGL находится в открытом репозитории. Литература Читать дальше …
Опыт изучения OpenGL — Часть 1 — Введение
С детства мечтал писать компьютерные игры, и вот, года три назад решил рискнуть — поизучать OpenGL. Почему взялся изучать не игровой движок, а низкоуровневый API (API — Application Programming Interface)? Потому что люблю изучать все с как можно более низкого уровня, чтобы разобраться как оно работает (например, изучение языка ассемблера Intel очень помогло моему пониманию языков Си и C++). А почему OpenGL, а не DirectX? — Просто по OpenGL я смог найти больше литературы, чем по DirectX. Изучать OpenGL — Читать дальше …