- OpenGL Driver Support
- Release Driver Downloads
- Windows
- Linux
- Developer Beta Driver Downloads
- Windows 426.02
- Linux 418.52.18
- OpenGL Beta Release Notes
- Turing GPU Architecture
- Volta GPU Architecture
- Pascal GPU Architecture
- Maxwell 2 GPU Architecture
- Maxwell 1 GPU Architecture
- Kepler GPU Architecture
- Turing Extensions for OpenGL
- Release Updates
- OpenGL Driver
- Возможности OpenGL Driver
- Carambis Driver Updater
- Auslogics Driver Updater
- Драйвер NVIDIA GeForce
- GeForce Experience
- OpenGL Driver скачать бесплатно
- Полное описание
- OpenGL 4.5
- Информация о программе
- Описание
- Opengl для всех видеокарт
- Содержание
- Клонируем репозиторий, создаём ветку
- Что такое OpenGL
- OpenGL спроектирован для видеокарт
- Создаём сцену для работы с OpenGL
- Путаница версий OpenGL
- Устанавливаем glm
- Как работает OpenGL
- Шаг №1 — загрузка вершин примитивов
- Шаг №2 — обработка вершин примитивов вершинным шейдером
- Шаг №3 — интерполяция атрибутов вершин и фрагментация примитивов
- Шаг №4 — обработка фрагментов фрагментным шейдером
- Шаг №5 — проверки, смешивание цвета и запись в буфер кадра
- Конвейер в целом
- Подготовка: RandomColorGenerator
- Запускаем конвейер
- Компиляция шейдеров
- Вершинные данные
- Vertex Buffer Object и Vertex Array Object
- Триангуляция пятиугольника
- Триангуляция круга
- Выполняем триангуляцию двух фигур
- Устанавливаем матрицу проецирования
- Реализуем метод redraw
OpenGL Driver Support
This page provides links to both general release drivers that support OpenGL 4.6, and developer beta drivers that support upcoming OpenGL features.
Release Driver Downloads
OpenGL 4.6 support is available for Windows and Linux in our general release drivers available here:
Windows
Linux
Developer Beta Driver Downloads
Windows driver version 426.02 and Linux driver version 418.52.18 provide new features for OpenGL developers to test their upcoming OpenGL applications.
Windows 426.02
Linux 418.52.18
OpenGL Beta Release Notes
NVIDIA provides full OpenGL 4.6 support and functionality on NVIDIA GeForce and Quadro graphics card with one of the following Turing, Volta, Pascal, Maxwell (first or second generation) or Kepler based GPUs:
Turing GPU Architecture
- TITAN: NVIDIA TITAN RTX
- GeForce RTX: GeForce RTX 2080 Ti, GeForce RTX 2080, GeForce RTX 2070, GeForce RTX 2060
- GeForce GTX: GeForce GTX 1660 Ti, GeForce GTX 1660, GeForce GTX 1650, GeForce MX250, GeForce MX230
- Quadro: Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Quadro RTX 4000, Quadro RTX 3000, Quadro T2000, Quadro T1000
Volta GPU Architecture
- TITAN: NVIDIA TITAN V
- Quadro: Quadro GV100
Pascal GPU Architecture
- TITAN: NVIDIA TITAN Xp, NVIDIA TITAN X (Pascal)
- GeForce: GeForce GTX 1080 Ti, GeForce GTX 1080, GeForce GTX 1070 Ti, GeForce GTX 1070, GeForce GTX 1060, GeForce GTX 1050 Ti, GeForce GTX 1050, GeForce GT 1030, GeForce MX150,
- Quadro: Quadro GP100, Quadro P6000, Quadro P5200, Quadro P5000, Quadro P4200, Quadro P4000, Quadro P3200, Quadro P3000, Quadro P2200, Quadro P2000, Quadro P1000, Quadro P620, Quadro P600, Quadro P520, Quadro P500, Quadro P400
Maxwell 2 GPU Architecture
- TITAN: GeForce GTX TITAN X
- GeForce: GeForce GTX 980 Ti, GeForce GTX 980, GeForce GTX 980M, GeForce GTX 970, GeForce GTX 970M, GeForce GTX 965M, GeForce GTX 960, GeForce GTX 950,
- Quadro: Quadro M6000 24GB, Quadro M6000, Quadro M5500, Quadro M5000, Quadro M5000M, Quadro M4000, Quadro M4000M, Quadro M3000M, Quadro M2200, Quadro M2000
Maxwell 1 GPU Architecture
- GeForce: GeForce GTX 960M, GeForce GTX 950M, GeForce 945M, GeForce 940MX, GeForce 930MX, GeForce 920MX, GeForce 940M, GeForce 930M, GeForce GTX 860M, GeForce GTX 850M, GeForce 845M, GeForce 840M, GeForce 830M, GeForce GTX 750 Ti, GeForce GTX 750, GeForce GTX 745, GeForce MX130
- Quadro: Quadro M2000M, Quadro M1000M, Quadro M600M, Quadro M500M, Quadro M1200, Quadro M620, Quadro M520, Quadro K2200M, Quadro K620M
Kepler GPU Architecture
- TITAN: GeForce GTX TITAN, GeForce GTX TITAN Black, GeForce GTX TITAN Z
- GeForce: GTX 780 Ti, GeForce GTX 780, GeForce GTX 770, GeForce GTX 760, GeForce GTX 760 Ti (OEM), GeForce GT 740, GeForce GT 730, GeForce GT 720, GeForce GT 710, GeForce GTX 690, GeForce GTX 680, GeForce GTX 670, GeForce GTX 660 Ti, GeForce GTX 660, GeForce GTX 650 Ti BOOST, GeForce GTX 650 Ti, GeForce GTX 650, GeForce GTX 645, GeForce GT 640, GeForce GT 635, GeForce GT 630, GeForce MX110
- Quadro: Quadro K6000, Quadro K5200, Quadro K5000, Quadro K4000, Quadro K4200, Quadro K2200, Quadro K2000, Quadro K2000D, Quadro K1200, Quadro K620, Quadro K600, Quadro K420, Quadro 410
The OpenGL 4.6 specifications can be downloaded from http://www.opengl.org/registry/.
For any bugs or issues, please file a bug through the developer website: https://devtalk.nvidia.com/
Turing Extensions for OpenGL
GPUs with the new Turing architecture have many new OpenGL extensions giving developers access to new features.
Release Updates
July 29th, 2019 — Windows 426.02, Linux 418.52.18
OpenGL Driver
OpenGL Driver — это набор драйверов, позволяющих оптимизировать работу графической карты NVIDIA. Софт поддерживает большое количество видеокарт, совместим со всеми версиями Windows.
Возможности OpenGL Driver
- Быстрая установка драйверов OpenGL;
- Корректная работа с софтом и играми;
- Интеграция с утилитой Extension Viewer;
- Удобное средство контроля состояния видеоадаптера;
- Повышение качества отображения трехмерной графики;
- Набор библиотек регулярно обновляется официальным сайтом компании NVIDIA.
- Использование современных графических технологий;
- Повышает производительность в играх;
- Предельно простое управление и понятный интерфейс;
- Вывод полной информации о драйвере вашей видеокарты;
- Полная поддержка GeForce Series Quadro, 400/500/600/700/900;
- Новая версия OpenGL 2015 получила множество улучшений и исправлений.
- Английский язык интерфейса;
- В OpenGL нет поддержки видеокарт Radeon HD.
Carambis Driver Updater
Auslogics Driver Updater
Драйвер NVIDIA GeForce
GeForce Experience
OpenGL Driver скачать бесплатно
Последняя версия:
355.97 от 29.05 2018
Разработчик: NVIDIA Corporation
Операционные системы:
Windows 7, 8, 10, XP, Vista
Размер файла: 200 Mb
Полное описание
Драйвера NVIDIA OpenGL необходимы для расширения возможностей видеокарты вашего компьютера и эффективного повышения её производительности. Программным обеспечением поддерживается множество моделей графических процессоров, среди которых: GeForce GTX 480, GT 420, GT 430, GT 440, GT 530, GT 520, GT 570, GTX 580, GTX 465, GTX 460 SE v2, GTX 590, GT 470, GeForce GTS 450, M6000 Quadro 4000, K5000, K5200, K6000 и так далее.
Стоит отметить совместимость OpenGL с Windows 10 и 8. Софт не только устанавливает соответствующий пакет библиотек, но и обновляет текущие версии драйверов на более новые из собственной базы данных. Также доступен просмотр подробной информации о графической карте.
На GTX 580 все установилось и работает. Система Виндовс 7, рекомендую сайт.
на win 8.1 будет работать?
Удивило что для XP ещё можно найти версию программы. Спасибо за хороший софт, реально помогает улучшить графику. Первое на чём я испытал драйвер, это GTA San Andreas и знаете, был неожиданно впечатлён результатом, куда лучше штатных возможностей видеокарты.
Отлично, не плохо. Когда зашёл в майнкрафт, сразу стало лучше играть! Играбельно. Спасибо.
а как скачать на видеокарту AWD RADEON SOFTWARE прост недавно комп обновили а мне для некоторых игор надо опендл
OpenGL 4.5
Информация о программе
Описание
OpenGL — это, своего рода, интерфейс для создания приложений, использующих 2D и 3D графику. Это спецификация с набором API, которую используют разработчики программ, а инженеры реализуют данные функции при производстве видеокарт.
Аббревиатура OpenGL расшифровывается как Open Graphics Library или открытая графическая библиотека. Программное обеспечение позволяет создавать кроссплатформенные визуальные эффекты, которые одинаково отображаются на Windows, MacOS, Unix и PS3.
Набор библиотек OpenGL 4.5 насчитывает более 300 функций, которые позволяют создавать 3D сцены с помощью примитивов. Также спецификации содержат инструменты для оптимизации моделей в трехмерном пространстве, стирания невидимых поверхностей, работы с цветами и оттенками, текстурирования и сглаживания. Программное обеспечение помогает реалистично настраивать свет, применять эффекты дыма, тумана и др.
Функции и особенности OpenGL 4.5:
- Спецификации для 2D и 3D графики;
- Отображение моделей и сцен на Windows, MacOS, Unix и PS3;
- Работа с окнами посредством библиотеки GLUT;
- Локальный и сетевой рендеринг (GLX);
- Настройка освещения и детальная проработка цвета;
- Инструменты для оптимизации и просмотра трехмерных моделей;
- Отсутствие русской локализации.
Поддерживаемые системы (x64/x32):
Opengl для всех видеокарт
В статье мы познакомимся со стандартом OpenGL и напишем простейшее приложение, использующее API OpenGL.
Содержание
Клонируем репозиторий, создаём ветку
Для освоения OpenGL мы будем использовать репозиторий с примерами cg-course-2018/QtLabs2D. Если вы ещё не клонировали к себе этот репозиторий, клонируйте его. После этого вы можете переключиться на ветку stable в интерфейсе своего клиента git или в консоли.
Вы должны переключиться в существующую ветку, а не в новую. Возможно, перед началом потребуется синхронизировать репозитории ( git fetch origin ).
Теперь на основе ветки stable создайте ветку tmp_
Ветку не нужно будет отправлять на удалённый репозиторий. Она временная.
Что такое OpenGL
OpenGL — это стандарт API для рисования трёхмерной графики. В нашем курсе будем использовать OpenGL 3.x — примерно то же самое, что GLES 2.x или WebGL 1.
Посмотрите на общую историю версий графических API, чтобы понять, где мы находимся:
За годы, прошедшие между OpenGL 1.x и OpenGL 3.x, представления программистов о 3D-графике изменились кардинально. Было обнаружено, что программный интерфейс, разработанный для OpenGL 1.0, имеет недостаточную гибкость и потворствует потерям производительности при рисовании графики. Начиная с OpenGL 3.0, была представлена полностью новая модель программирования с использованием OpenGL, а старый способ был объявлен устаревшим.
В последующие годы появились очередные новшества, такие как OpenGL 4.x и Vulkan. Они нацелены на сверхбыстрый параллелизм при вычислениях и на нестандартные применения видеокарт (например, для выполнения расчётов общего назначения с помощью Computing Shaders). Если же вы хотите изучить именно графику, не стоит оглядываться на OpenGL 4 и Vulkan: их использование даже в минимальных примерах требует прекрасного понимания 3D-графики, умения качественно писать многопоточный и асинхронный код, глубоких знаний в системном программировании.
OpenGL спроектирован для видеокарт
Это означает, что в OpenGL приложениях изображение рисует не центральный процессор, а множество узкоспециализированных процессоров внутри видеокарты. В редких случаях используется медленная программная растеризация: в этом случае изображение рисует центральный процессор в несколько потоков.
Современные видеокарты предоставляют огромные вычислительные возможности благодаря параллельной обработке вершин и фрагментов. Это хорошо показано на видео “CPU vs GPU” от NVIDIA:
Возможности OpenGL на конкретном компьютере зависят от операционной системы и от производителя драйвера. OpenGL на Linux и на Windows имеют разные возможности. OpenGL в драйверах от NVIDIA и в драйверах от Intel также различаются. Тем не менее, можно писать код, одинаково качественно работающий на любой реализации OpenGL — для этого нужно соблюдать стандарты и внимательно читать документацию используемых функций OpenGL.
Создаём сцену для работы с OpenGL
В наборе проектов QtLabs2D из шаблона Qt GUI Application создайте новый проект приложения с названием “Sample05”:
Удалите все файлы, кроме “main.cpp”. Перейдите к настройкам проекта и добавьте в пути поиска заголовочных файлов путь к корню репозитория. Это можно сделать, используя переменную SolutionDir:
Затем нужно добавить ссылку на проект libplatform, чтобы система сборки автоматически выполняла компоновку с ним.
Затем перепишите в “main.cpp” следующий код:
Наконец, соберите и запустите проект “Sample05”. Программа должна собраться успешно, после запуска программы отобразится окно размерами 800×600 (вероятно, залитое чёрным цветом).
Теперь создадим и подключим класс сцены. Создайте в проекте заголовок и “*.cpp” файл для класса SimpleScene.
В заголовке “SimpleScene.h” вам нужно подключить заголовок
, и затем перегрузить методы интерфейса IRenderScene:
Реализация класса пока что будет пустой:
Теперь можно передать объект класса сцены объекту окна. В функции main добавьте соответствующую инструкцию:
Путаница версий OpenGL
Интерфейс OpenGL состоит из функций и констант. В новых версиях OpenGL старые функции и константы исчезали (в режиме Core Profile) либо оставались в роли устаревших (в режиме Compatibility Profile).
Для использования OpenGL предоставляется заголовок . Какую версию OpenGL вы увидите в этом заголовке?
- На Windows: OpenGL 1.1, API 1997-го года
- На Android/iOS: зависит от версии NDK/SDK
- На Linux/Mac OSX: зависит от способа подключения заголовка (набора макросов) и версии ОС
Реализацию OpenGL предоставляет видеодрайвер. Это означает, что на Windows с современной видеокартой NVIDIA вам может быть доступна последняя версия OpenGL, а с древней видеокартой — только версия 2.0 или даже 1.1.
На современных Linux/Mac OSX ситуация лучше: если видеокарта устаревшая, то новые возможности OpenGL буду эмулироваться программно. Это работает медленнее и нагружает центральный процессор, зато вам доступна новая версия OpenGL.
Как использовать OpenGL без привязки к версии платформы? Для этой в Qt5 есть класс QOpenGLFunctions_3_3_Core (и серия похожих классов). Вы можете унаследовать от него свой класс сцены
Также добавьте инициализацию функций OpenGL в метод initialize:
Устанавливаем glm
Для установки библиотек мы будем использовать пакетный менеджер vcpkg. Пакетный менеджер vcpkg распространяется в исходниках и собирается на машине разработчика. Для сборки потребуется установленная Visual Studio с инструментами C++ разработчика.
Порядок установки описан в консольных командах:
После того, как вы получили vcpkg.exe , вы можете устанавливать пакеты командой install .
В частности, нам потребуется установить GLBinding и GLM:
В команде, представленной выше, имена пакетов перечисляются по порядку, а в качестве суффикса используется так называемый “триплет”: имя_пакета:триплет .
- Имя пакета задаёт одно из множества имён доступных библиотек, полный список есть в блоге Visual C++ Team
- Триплет задаёт архитектуру и режим сборки
Для удобства использования пакетов vcpkg вы можете включить режим интеграции для всех проектов на своей машине одной командой:
Как работает OpenGL
В основном OpenGL оперирует треугольниками, изображениями и состояниями драйвера рисования. Если упростить схему работы, останется пять ключевых шагов рисования каждого объекта на экране. Рассмотрим все эти шаги.
Шаг №1 — загрузка вершин примитивов
Программист передаёт из управляющей программы массивы данных, описывающих вершины графических примитивов, то есть треугольников, линий или точек (чаще всего треугольников). Каждая фигура и каждая поверхность будет нарисована с помощью примитивов. На рисунке показано, как разбить сектор эллипса на треугольники:
Шаг №2 — обработка вершин примитивов вершинным шейдером
На втором шаге выполняется вершинный шейдер (англ. vertex shader): он получает на вход все данные одной из вершин, а на выход обязан предоставить четырёхкомпонентный вектор с координатами вершины и набор любых других данных для фрагментного шейдера:
Программист заранее указывает свой вершинный шейдер. Его пишут на специальном языке GLSL, затем он компилируется видеодрайвером и выполняется прямо на видеокарте.
Шаг №3 — интерполяция атрибутов вершин и фрагментация примитивов
Представьте, что вы рисуете треугольник на клетчатой бумаге. Какие-то клетки будут зарисованы полностью, другие — только частично, а оставшиеся не будут зарисованы вообще. Точно так же видеокарта должна определить, в какие пиксели попадает треугольник. Эти пиксели называются фрагментами.
Представьте, что вы захотели сделать треугольник разноцветным, с плавным переходом от жёлтого цвета по левому краю в красный цвет на правом. В OpenGL это выполняется автоматически:
- вы указываете разные цвета для каждой из вершин треугольника
- на шаге №3 видеокарта выполняет в каждом фрагменте линейную интерполяцию, вычисляя взвешенное значение цвета или любого другого атрибута
Линейная интерполяция — это интерполяция с линейным (равномерным) изменением свойства от вершины A к вершине B. Возьмём условный параметр t ∈ [0..1] , описанный следующим образом:
- для фрагмента, содержащего вершину A, t = 0
- для фрагмента, содержащего вершину B, t = 1
- для фрагмента, лежащего между A и B ровно посередине, t = 0.5
- и так далее для всех фрагментов между A и B
Линейно интерполированное свойство фрагмента будет вычисляться по формуле: p(t) = pA ∙ (1 — t) + pB ∙ t . Легко заметить, что эта формула работает для самих вершин A и B:
- для вершины A: p(0) = pA ∙ (1 — 0) + pB ∙ 0 = pA
- для вершины B: p(1) = pA ∙ (1 — 1) + pB ∙ 1 = pB
Конечный результат линейной интерполяции RGBA-цвета от вершин по всему треугольнику показан на рисунке:
Шаг №4 — обработка фрагментов фрагментным шейдером
На данном шаге снова вызывается пользовательский код в составе фрагментного шейдера (англ. fragment shader). Его также пишут на языке GLSL. Фрагментный шейдер получает на вход всё, что вершинный шейдер ему передал, но в преобразованном виде. Допустим, вершинный шейдер сохранил для фрагментного цвет вершины — но фрагментный шейдер оперирует фрагментами, и поэтому переданные данные также проходят линейную интерполяцию.
Шаг №5 — проверки, смешивание цвета и запись в буфер кадра
На последнем шаге фрагмент проходит ряд тестов — в каждом из них видеокарта проверяет, должен ли фрагмент попасть в кадр. Например, в 3D пространстве фрагмент может быть закрыт другим геометрическим телом, и это выявляется в тесте глубины (англ. depth test).
Если проверка пройдена (что в 2D графике случается почти всегда), то фрагмент записывается в пиксель кадра. Перед эти выполняется смешивание, позволяющее наложить полупрозрачный пиксель на существующий фон кадра.
Конвейер в целом
Все шаги конвейера изображены на единой схеме, взятой из статьи An intro to modern OpenGL. Chapter 1: The Graphics Pipeline:
Подготовка: RandomColorGenerator
Чтобы продемонстрировать работу интерполяции атрибутов вершин, мы будем генерировать цвета вершин случайным образом. Для этого создайте класс RandomColorGenerator. Объявление будет следующим:
Реализация генератора случайных цветов будет всего лишь выбирать цвет из готовой палитры:
Запускаем конвейер
Перейдите к “SimpleScene.cpp” и добавьте подключение заголовков glm. Заголовки пригодятся нам для работы с векторной алгеброй.
Создайте анонимное пространство имён и добавьте в него константы-строки, содержащие исходные коды вершинного и фрагментного шейдеров.
Анонимное пространство имён прячет константы и функции от других единиц трансляции (cpp-файлов), тем самым избавляя вас от неожиданных конфликтов имён функций.
Компиляция шейдеров
Что такое шейдер? Это маленькая программа на языке GLSL (расшифровывается OpenGL Shading Language). Задача программы зависит от типа шейдера: вершинный шейдер трансформирует вершины, фрагментный шейдер вычисляет цвет фрагмента фигуры. Шейдер работает как чистая функция: один вход, один выход и никаких состояний (вы не можете ничего запомнить между двумя вызовами шейдера).
Компиляция шейдера выполняется во время выполнения вашей программы. Компилятор шейдеров находится в ядре видеодрайвера. Руководит компиляцией ваша программа. В OpenGL разделены понятия “шейдер” и “программа”. Программа состоит из нескольких разнотипных шейдеров. Минимальная программа в OpenGL Core Profile состоит из вершинного и фрагментного шейдеров.
Общая схема компиляции шейдеров изображена ниже.
Для сборки шейдера мы будем использовать API OpenGL. Примерная схема вызовов (без обработки ошибок) выглядит следующим образом:
Добавьте классу SimpleScene три поля:
После этого в метод initialize() добавьте вызов нового приватного метода initializeShaders() , в котором будет размещена компиляция шейдеров и компоновка программы:
Приватный метод compileShader будет выполнять компиляцию шейдера и проверку статуса компиляции:
Приватный метод linkProgram выполняет компоновку программы из шейдеров:
В конце добавьте в деструктор SimpleScene удаление шейдерной программы и шейдеров:
Вершинные данные
В старых версиях OpenGL существовали стандартные атрибуты (свойства) вершин: координаты, текстурные координаты, цвет и так далее. Однако, стандартизация ограничивала возможности программиста. Поэтому в современном OpenGL вершина может иметь какие угодно числовые или векторные величины, описывающие её содержимое. Способ интерпретации вершинных данных вы определяете самостоятельно в шейдерах.
Наши шейдеры ожидают два атрибута на каждую вершину: двумерные координаты и четырёхмерный цвет (RGBA). Поэтому мы поместим в начале заголовка “SimpleScene.h” определение структуры, которую мы назовём VertexP2C4:
Далее мы должны сообщить драйверу видеокарты смещения атрибутов вершины в памяти. Дело в том, что на видеокарту мы будем загружать целые массивы вершин, и внутри массива будут так называемые interleaved массивы атрибутов. Другими словами, несколько массивов атрибутов как будто бы сплетены в единый массив вершинных данных:
Во время компиляции шейдера видеодрайвер назначил каждому атрибуту его собственный целочисленный идентификатор. Мы должны получить у шейдерной программы идентификаторы атрибутов, а затем для каждого атрибута указать смещения в памяти, с помощью которых OpenGL сможет в непрерывном массиве памяти найти нужные байты. Этим займётся приватный метод bindVertexData:
Vertex Buffer Object и Vertex Array Object
Vertex Buffer Object — это объект видеодрайвера, представляющий область пользовательских данных на видеокарте. Для программиста VBO доступен в виде целочисленного идентификатора.
Чтобы хранить целочисленный идентификатор VBO, добавьте в SimpleScene поле GLuint m_vbo = 0; .
Кроме того, мы будем хранить Vertex Array Object — объект, позволяющий оптимизировать смену состояний видеодрайвера. Пока что мы используем VAO просто потому, что OpenGL требует хотя бы одного VAO, поэтому добавьте в класс ещё одно поле: GLuint m_vao = 0;
Затем в функцию initialize добавьте инициализацию VBO и VAO:
В конце добавьте деструктор классу SimpleScene, который будет очищать данные:
Триангуляция пятиугольника
Среди всех многоугольников в компьютерной графике предпочитают выпуклые многоугольники (англ. convex), т.к. их проще всего разделить на треугольники. Согласно википедии:
Выпуклым многоугольником называется многоугольник, все точки которого лежат по одну сторону от любой прямой, проходящей через две его соседние вершины.
Благодаря этому мы можем разделить выпуклый многоугольник на треугольники с помощью центральной точки. Таким образом мы создадим своего рода веер треугольников.
Следует учесть, что многие вершины будут продублированы — каждая внешняя вершина входит в состав двух треугольников, но при этом треугольники могут иметь разный цвет, а цвета определяются вершинами.
Добавьте в анонимное пространство имён функции триангуляции многоугольника:
Триангуляция круга
Разделить круг на треугольники легко с помощью тригонометрии: достаточно пройтись по углам от 0° до 360° с некоторым шагом, например, 1°. Каждый угол вместе с радиусом задаёт точку в полярных координатах.
Перевести полярные координаты в декартовы очень легко — достаточно вспомнить одно из определений синуса и косинуса:
Декартовы координаты по-английски называются Эвклидовыми (euclidean), и мы назовём функцию соответствующе:
Теперь мы можем описать функцию для триангуляции круга:
Выполняем триангуляцию двух фигур
Теперь мы можем триангулировать фигуры, чтобы получить результат, который вы видите на скриншоте:
Прежде всего добавьте в SimpleScene новое поле size_t m_vertexCount = 0; — позже число треугольников потребуется нам для рисования.
Добавим в main следующий код в метод initializeShapes, вызов которого надо поместить в конец метода initialize:
Устанавливаем матрицу проецирования
Казалось бы, что может быть проще, чем наложить виртуальные координаты холста на координаты окна? Однако, OpenGL устроен иначе: он рассчитан на 3D графику, в которой координаты виртуального мира не совпадают с координатами окна. Более того, начало координат OpenGL находится в нижнем левом углу, а не в верхнем левом!
Ради нужд 3D графики все координаты вершин проецируются внутрь куба размерами 2x2x2 условных единиц с помощью матрицы проецирования. Поскольку мы хотим получить 2D координаты, да ещё и совмещённые с привычными координатами окна, нам нужна матрица ортографического проецирования, которая растянет координаты вершин обратно из куба 2x2x2 в координаты окна. Для этой цели мы напишем метод setProjectionMatrix , выполняющий две задачи:
- вычислить матрицу ортографического проецирования из куба на координаты окна с помощью функции glm::ortho
- установить эту матрицу как константу в шейдерной программе с помощью glUniformMatrix4fv
Реализуем метод redraw
Метод redraw будет с использованием полученных размеров окна устанавливать так называемый Viewport, привязывать шейдерную программу и VAO, а затем очищать изображение, устанавливать матрицу проецирования, наконец, вызывать glDrawArrays для рисования всех примитивов.
Теперь вы наконец можете собрать, запустить и увидеть готовый результат!