Рендерер графического процессора что это opengl

Обновлено: 07.07.2024

В OpenGL все находится в трехмерном пространстве, а экраны и окна представляют собой массивы двумерных пикселей. Это приводит к большей части работы OpenGL по преобразованию трехмерных координат в двухмерные пиксели, которые соответствуют размеру экрана. Процесс преобразования 3D-координат в 2D-координаты выполняется OpenGL.Графический конвейер, В основном переводится как конвейеры, на самом деле относится к процессу, в котором набор исходных графических данных проходит через конвейер передачи и, наконец, появляется на экране посредством различных изменений во время процесса). Конвейер отрисовки графики можно разделить на две основные части:
1. Первая часть преобразует ваши 3D-координаты в 2D-координаты,
2. Вторая часть - преобразовать 2D-координаты в реальные цветные пиксели.

В этом уроке мы кратко обсудим конвейер рендеринга графики и то, как его использовать для создания красивых пикселей.

2D-координаты и пиксели также различаются. 2D-координаты точно представляют положение точки в 2D-пространстве, а 2D-пиксели являются приближением этой точки. 2D-пиксели ограничены разрешением вашего экрана / окна.

Конвейер графического рендеринга принимает набор 3D-координат и преобразует их в цветные 2D-пиксели на экране для вывода. Конвейер графического рендеринга можно разделить на несколько этапов, и каждый этап будет принимать выходные данные предыдущего этапа в качестве входных. Все эти этапы узкоспециализированы (все они выполняют определенную функцию) и легко выполняются параллельно. Именно благодаря характеристикам параллельного выполнения большинство видеокарт сегодня имеют тысячи небольших процессорных ядер, и они запускают свои собственные небольшие программы для каждого этапа (конвейера рендеринга) на графическом процессоре, таким образом, быстро в конвейере графического рендеринга. . Эти небольшие программы называютсяШейдер。

Некоторые шейдеры позволяют разработчикам настраивать себя, что позволяет нам заменять шейдеры по умолчанию на шейдеры, написанные нами самими. Таким образом, мы можем более подробно контролировать определенные части конвейера рендеринга графики, а поскольку они работают на графическом процессоре, они могут сэкономить нам драгоценное время процессора. Используется шейдер OpenGLЯзык шейдинга OpenGL (GLSL) Написано.

Ниже вы увидите абстрактное отображение каждого этапа конвейера рендеринга графики. Обратите внимание, что синяя часть представляет собой часть, в которую мы можем вводить пользовательские шейдеры.Синяя часть представляет собой программируемую пользователем часть.

mark

Как видите, конвейер рендеринга графики состоит из множества частей, и каждая часть будет обрабатывать свой собственный этап в процессе преобразования данных вершин в конечные пиксели. Мы объясним каждую часть конвейера рендеринга в целом, чтобы дать вам общее представление о том, как работает конвейер рендеринга графики.

Сначала мы передаем 3 трехмерные координаты в виде массива в качестве входных данных конвейера рендеринга графики для представления треугольника. Этот массив называетсяДанные вершин; Данные вершин - это набор вершин. Вершина - это набор данных трехмерных координат. Данные вершин представлены атрибутами вершин, которые могут содержать любые данные, которые мы хотим, но для простоты мы по-прежнему предполагаем, что каждая вершина состоит только из трехмерной позиции (Аннотация 1) и некоторых значений цвета.

Аннотация 1: Когда мы говорим о «местоположении», оно представляет собой особый атрибут места в «пространстве»; в то же время «пространство» представляет собой любую систему координат, такую ​​как трехмерные координаты x, y, z. система, двумерная система координат x, Y или линейная связь между x и y на прямой, но двумерная система координат - это плоское пространство, а прямая линия - очень тонкое и длинное пространство.

Чтобы OpenGL знал, что составляют наши координаты и значения цвета, OpenGL требует, чтобы вы указали тип рендеринга, представленный этими данными. Хотим ли мы преобразовать эти данные в серию точек? Серия треугольников? Или это просто длинная очередь? Эти сделанные подсказки называются примитивами, и любой вызов инструкции рисования передаст примитивы в OpenGL. Вот несколько из них: GL_POINTS, GL_TRIANGLES, GL_LINE_STRIP.

Первая часть конвейера графического рендерингаВершинный шейдер, В качестве входных данных требуется одна вершина. Основная цель вершинного шейдера - преобразовать трехмерные координаты в другие трехмерные координаты (будет объяснено позже), а вершинный шейдер позволяет нам выполнять некоторую базовую обработку атрибутов вершин.

Этап примитивной сборкиВозьмите все вершины, выводимые вершинным шейдером, как входные (если это GL_POINTS, то это вершина), и соберите все точки в форму указанного примитива; в примере в этом разделе это треугольник.

Результат этапа сборки элемента будет передан вГеометрический шейдер. Геометрический шейдер принимает набор вершин в форме примитивов в качестве входных данных и может создавать новые (или другие) примитивы, генерируя новые вершины для генерации других форм. В этом примере он генерирует еще один треугольник.

Выходные данные геометрического шейдера будут переданы вЭтап растеризации, Здесь он сопоставляет примитивы с соответствующими пикселями на конечном экране и генерирует фрагменты для использования во фрагментном шейдере. Будет выполнено перед запуском фрагментного шейдераВырезка. Обрезка удалит все пиксели за пределами вашего обзора, чтобы повысить эффективность выполнения.

Фрагмент в OpenGL - это все данные, необходимые OpenGL для рендеринга пикселя.

Как видите, конвейер отрисовки графики очень сложен и содержит множество настраиваемых частей. Однако в большинстве случаев нам нужно настроить только вершинные и фрагментные шейдеры. Шейдер геометрии не является обязательным, обычно подойдет шейдер по умолчанию.

В современном OpenGL мы должны определить как минимум один вершинный шейдер и один фрагментный шейдер (потому что в графическом процессоре нет вершинного / фрагментного шейдера по умолчанию)。

OpenGL — cпецификация, определяющая платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. OpenGL не является реализацией, а только описывает те наборы инструкций, которые должны быть реализованы, т.е. является API.

Каждая версия OpenGL имеет свою спецификацию, мы будем работать начиная с версии 3.3 и до версии 4.6, т.к. все нововведения с версии 3.3 затрагивают мало значимые для нас аспекты. Перед тем как начать писать своё первое OpenGL приложение, рекомендую узнать какие версии поддерживает ваш драйвер(сделать это можно на сайте вендора вашей видеокарты) и обновить драйвер до последней версии.

Устройство OpenGL

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

Например, если мы перед отрисовкой передадим OpenGL команду использовать линии вместо треугольников, то OpenGL все последующие отрисовки будет использовать линии, пока мы не изменим эту опцию, или не поменяем контекст.

Объекты в OpenGL

Библиотеки OpenGL написаны на C и имеют многочисленные API к ним для разных языков, но тем не менее это C библиотеки. Множество конструкций из языка С не транслируются в высокоуровневые языки, поэтому OpenGL был разработан с использованием большого количества абстракций, одной из этих абстракций являются объекты.

Объект в OpenGL — это набор опций, который определяет его состояние. Любой объект в OpenGL можно описать его (id) и набором опций, за который он отвечает. Само собой, у каждого типа объектов свои опции и попытка настроить несуществующие опции у объекта приведёт к ошибке. В этом кроется неудобство использования OpenGL: набор опций описывается C подобной структурой идентификатором которого, зачастую, является число, что не позволяет программисту найти ошибку на этапе компиляции, т.к. ошибочный и правильный код семантически неотличимы.

С таким кодом вы будете сталкиваться очень часто, поэтому когда вы привыкнете, что это похоже на настройку конечного автомата, вам станет намного проще. Данный код лишь показывает пример того, как работает OpenGL. В последствии будут представлены реальные примеры.

Но есть и плюсы. Основная фишка этих объектов состоит в том, что мы можем объявлять множество объектов в нашем приложении, задавать их опции и когда бы мы не запускали операции с использованием состояния OpenGL мы можем просто привязать объект с нашими предпочитаемыми настройками. К примеру этом могут быть объекты с данными 3D модели или нечто, что мы хотим на этой модели отрисовать. Владение несколькими объектами позволяет просто переключаться между ними в процессе отрисовки. С таким подходом мы можем сконфигурировать множество объектов нужных для отрисовки и использовать их состояния без потери драгоценного времени между кадрами.

Чтобы начать работать с OpenGL нужно познакомиться с несколькими базовыми объектами без которых мы ничего не сможем вывести на экран. На примере этих объектов мы поймём как связывать данные и исполняемые инструкции в OpenGL.

Базовые объекты: Шейдеры и шейдерные программы.=

Shader — это небольшая программа которая выполняется на графическом ускорителе(GPU) на определённом этапе графического конвейера. Если рассматривать шейдеры абстрактно, то можно сказать, что это этапы графического конвейера, которые:

  1. Знают откуда брать данные на обработку.
  2. Знают как обрабатывать входные данные.
  3. Знают куда записать данные для дальнейшей их обработки.

Но как же выглядит графический конвейер? Очень просто, вот так:




Пока в этой схеме нас интересует только главная вертикаль, которая начинается с Vertex Specification и заканчивается на Frame Buffer. Как уже говорилось ранее, каждый шейдер имеет свои входные и выходные параметры, которые отличаются по типу и количеству параметров.
Кратко опишем каждый этап конвейера, чтобы понимать, что он делает:

  1. Вершинный шейдер — нужен для обработки данных 3D координат и всех других входных параметров. Чаще всего в вершинном шейдере производятся вычисление положения вершины относительно экрана, расчёт нормалей (если это необходимо) и формирование входных данных в другие шейдеры.
  2. Шейдер тесселяции и шейдер контроля тесселяции — эти два шейдера отвечают за детализацию примитивов, поступающих из вершинного шейдера и подготавливают данные для обработки в геометрическом шейдере. Сложно описать в двух предложениях на что способны эти два шейдера, но чтобы у читателей было небольшое представление приведу пару изображений с низким и высоким уровнем теселяции:



Шейдеры OpenGL пишутся на специальном С-подобном языке GLSL из которого они компилируются и линкуются в шейдерную программу. Уже на данном этапе кажется, что написание шейдерной программы это крайне трудоёмкое занятие, т.к. нужно определить 5 ступеней графического конвейера и связать их воедино. К большому счастью это не так: в графическом конвейере по умолчанию определены шейдеры тесселяции и геометрии, что позволяет нам определить всего два шейдера — вершинный и фрагментный (иногда его назвают пиксельным шейдером). Лучше всего рассмотреть эти два шейдера на классическом примере:

Эти два простых шейдера ничего не вычисляют лишь передают данные дальше по конвейеру. Обратим внимение как связаны вершинный и фрагментный шейдеры: в вершинном шейдере объявлена out переменная Color в которую будет записан цвет после выполнения главной функции, в то время как в фрагментном шейдере объявлена точно такая же переменная с квалификатором in, т.е. как и описывалось раньше фрагментный шейдер получает данные из вершинного посредством нехитрого прокидывания данных дальше через конвейер (но на самом деле не всё так просто).

Замечание: Если в фрагментном шейдере не объявить и не проинициализировать out переменную типа vec4, то на экран ничего выводиться не будет.

Базовые объекты: Буферы и Вершинные массивы

Я думаю не стоит объяснять что такое буферные объекты, лучше рассмотрим как создать и заполнить буффер в OpenGL.

Ничего сложно в этом нет, привязываем сгенереный буффер к нужному таргету (позже узнаем к какому) и загружаем данные указывая их размер и тип использования.

GL_STATIC_DRAW — данные в буфере изменяться не будут.
GL_DYNAMIC_DRAW — данныe в буфере будут изменяться, но не часто.
GL_STREAM_DRAW — данные в буфере будут изменяться при каждом вызове отрисовки.

Отлчно, теперь в памяти GPU расположенные наши данные, скомпилирована и слинкована шейдерная программа, но остаётся один нюанс: как программа узнает откуда брать входные данные для вершинного шейдера? Данные мы загрузили, но никак не указали откуда шейдерной программе их брать. Эту задачу решает отдельный тип объектов OpenGL — вершинные массивы.


image

Как и с буферами вершинные массивы лучше рассмотреть на примере их конфигурации

Создание вершинных массивов ничем не отличается от создания других OpenGL объектов, самое интересное начинается после строчки: Вершинный массив (VAO) запоминает все привязки и конфигурации проводимые с ним, в том числе и привязывание буферных объектов для выгрузки данных. В данном примере такой объект всего один, но на практике их может быть несколько. После чего производится конфигурация вершинного атрибута с определённым номером:

  1. Номер атрибута, который мы хотим сконфигурировать.
  2. Количество элементов, которые мы хотим взять. (Т.к. входная переменная вершинного шейдера с layout = 0 имеет тип vec3, то мы берём 3 элемента типа float)
  3. Тип элементов.
  4. Нужно ли нормализовывать элеметы, если речь идёт о векторе.
  5. Смещение для следующей вершины (Т.к. у нас последовательно расположены координаты и цвета и каждый имеет тип vec3, то смещаемся на 6 * sizeof(float) = 24 байта).
  6. Последний аргумент показывает какое смещение брать для первой вершины. (для координат этот аргумент равен 0 байт, для цветов 12 байт)

Всё теперь мы готовы отрендерить наше первое изображение

Не забудьте привязать VAO и шейдерную программу перед вызовом отрисовки.

Если вы всё сделали правильно, то вы должны получить вот такой результат:




Результат впечатляет, но откуда в треугольнике градиентная заливка, ведь мы указали всего 3 цвета: красный, синий и зелёный для каждой отдельной вершины? Это магия шейдера растеризации: дело в том, что во фрагментный шейдер попадает не совсем то значение Color которое мы установили в вершинном. Вершин мы передаём всего 3, но фрагментов генерируется намного больше (фрагментов ровно столько же сколько закрашенных пикселей). Поэтому для каждого фрагмента берётся среднее из трёх значений Color в зависимости от того насколько близко он находится к каждой из вершин. Это очень хорошо прослеживается у углов треугольника, где фрагменты принимают то значение цвета, которое мы указали в вершинных данных.

Забегая чуть вперёд скажу, что текстурные координаты передаются точно так же, что позволяет с лёгкостью накладывать текстуры на наши примитивы.

Думаю на этом стоит закончить данную статью, самое сложное уже позади, но самое интересное только начинается. Если у вас есть вопросы или вы увидели ошибку в статье, напишите об этом в комментариях, я буду очень признателен.

В следующей статье мы рассмотрим трансформации, узнаем о unifrom переменных и научимся накладывать текстуры на примитивы.

Включите OpenGL Skies для лучшей производительности в Android-играх

Включите OpenGL Skies для лучшей производительности в Android-играх

Включите OpenGL Skia для лучшей производительности в играх и интерфейсе Android
Игры на мобильных платформах (Android и iOS) достигли невероятного роста всего за несколько лет. Если сначала игры были довольно простыми, как, например, 80 PC, эти игры стали чрезвычайно сложными.

Игры на Android или iOS почти такие же, как на вашем ПК или консолях.


Поскольку игры на мобильных устройствах в настоящее время очень сложны, потребление ресурсов также увеличилось. Если у топ-телефонов нет проблем с запуском последних названий, более старые устройства в значительной степени нахмурились от резких изображений, которые приводят к неприятному опыту.

У большинства геймеров нет самых горячих телефонов.


Поскольку не у всех есть лучшие телефоны, Google нашел решение предложить небольшое повышение производительности тем, у кого слабые телефоны. Этот параметр повышает производительность игр при условии, что у нас есть ОС Oreo Android или новее. В старых версиях Android этот параметр недоступен.

Переход от графического движка OpenGL к OpenGL Skia.


Графический движок OpenGL Skia можно активировать с помощью:
Настройки / Параметры разработчика / Воспроизведение с аппаратным ускорением / Установка графического процессора… / выберите OpenGL Skia здесь

Бонус, Настройки кэша и Ускорение скорости интерфейса.


За исключением настройки, которая активирует графический движок OpenGL Skia, есть два важных параметра, которые заставят ваш Android двигаться быстрее.

1. Очистить кеш из: Настройки телефона / Хранение и память / Данные кэширования. Кэшированные данные больше не полезны, поэтому вы можете удалить их без проблем.

2. Увеличьте скорость анимации и переход окон из: Параметры разработчика / Рисование / Масштаб анимации . Масштаб перехода . Масштаб длительности . установите их все на 0,5 или отключите анимацию, но все будет двигаться слишком резко, если вы отключите его; Я думаю, что 0,5 идеально.

Учебники нравится:

Активируйте OpenGL Skia для лучшей производительности в играх для Android - Видеоурок


Что это за программа

И сразу же хочу уточнить, что это вовсе не программа в привычном понимании, не драйвер, не протокол и не служба.

OpenGL — спецификация, которой определяется программный интерфейс для написания приложений, использующих 2D и 3D графику. По сути, это инструмент, который регулирует рендеринг изображения видеокартой.

Название расшифровывается как Open Graphics Library, то есть «Открытая графическая библиотека». Открытость инструмента означает, что им может воспользоваться любой разработчик без всякой маржи и лицензионных отчислений.

Инструмент кроссплатформенный: созданные с его помощью приложения будут работать в любой среде, которые осуществляют его поддержку.

При этом работать будут одинаково все в зависимости от мощности рабочей станции. Такая реализация освобождает разработчика от необходимости писать код под каждую конкретную платформу, что позволяет полностью сосредоточиться на графической составляющей.

Основные области применения OpenGL — видеоигры, системы автоматизированного проектирования, поддержка виртуальной реальности и визуализация различных проектов. На платформе Windows главным конкурентом технологии является DirectX.

О том, что такое DirectX и зачем он нужен, вы можете почитать вот тут.

Концепция OpenGL была разработана в 1982 году в университете Стэнфорда. Аппаратно прототип технологии впервые реализовала компания Silicon Graphics, создавшая конвейер для рендеринга. Ее разработки стали основой библиотек OpenGL.

Как работает OpenGL


Если смотреть с точки зрения разработчика, то OpenGL — программный интерфейс, который управляет работой видеокарты. Всего есть чуть более 150 команд, с помощью которых программист определяет, какие именно объекты будут отправлены на рендеринг.Этим же стандартом определяются более тонкие настройки: например, тройная буферизация, трассировка лучей или сглаживание в играх.

Нет необходимости создавать разные версии графических объектов для отображения в различных режимах качества графики: все подстраивается «на автомате», исходя из заданных программистов параметров.

Проще говоря, программист определяет отображаемые объекты в трехмерном пространстве, их взаимное положение и взаимодействие, масштабирование, угол обзора и т.д., а также цвет и текстуру, а OpenGL уже заботится об их рендеринге.

Можно утверждать, что этот инструмент только воспроизводит объекты, но не взаимодействует с устройствами ввода — мышью, клавиатурой, геймпадом или игровым рулем. За это, а также за работу менеджера окон, отвечают уже другие компоненты.

Несмотря на кажущуюся сложность, OpenGL имеет четко продуманную структуру и простой процедурный интерфейс. При этом с помощью этого инструмента можно создавать действительно сложные сцены, состоящие из множества компонентов. Вычислительных мощностей требуется меньше по сравнению с другими библиотеками.

Некоторые версии OpenGL поддерживают работу по сети: объекты рендерятся на сервере, а клиентское приложение получает только их отображение. Благодаря этому можно создавать мощные воспроизводящие комплексы, состоящие из множества компьютеров.

Следует отметить, что в отличие от главного конкурента OpenGL можно считать универсальным инструментом. Главный конкурент, DirectX, «заточен» именно под игры. Многие игры поддерживают обе технологии.

Нужно ли переключаться между ними? На мой взгляд, нет никакой разницы, что именно вы используете, Независимо от технологии существенной разницы в производительности не замечено, если речь идет о платформе Windows.

Если же вы используете эмулятор Андроид на ПК, в этом случае рекомендую переключиться OpenGL: для систем семейства Unix этот инструмент подходит больше.

Также рекомендую ознакомиться с публикациями «Что делать, если видеокарта не поддерживает DirectX» и «Как посмотреть параметры видеокарты». Буду признателен, если вы расшарите этот пост в социальных сетях. До скорой встречи!

Читайте также: