Что такое шейдеры в OpenGL и для чего они нам нужны?

Я не являюсь носителем английского языка, и когда я пытаюсь пройти через вики и учебники openGL на www.learnopengl.com, это никогда не становится понятным по интуиции, как работает целая концепция. Может кто-нибудь может объяснить мне более абстрактным образом, как это работает? Что такое вершинный шейдер и шейдер фрагмента и для чего мы их используем?

Ответ 1

OpenGL wiki дает хорошее определение:

Шейдер - это пользовательская программа, предназначенная для работы на каком-либо этапе графического процессора.

В прошлом видеокарты были непрограммируемыми кусочками кремния, которые выполняли набор фиксированных алгоритмов:

  • входные данные: трехмерные координаты треangularьников, их цвета, источники света
  • вывод: 2D изображение

все с использованием одного фиксированного параметризованного алгоритма, обычно вдоль https://en.wikipedia.org/wiki/Phong_reflection_model.

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

Так как технология производства полупроводников продвинулась, и разработчики графических процессоров смогли собрать больше транзисторов на квадратный миллиметр, поставщики стали разрешать программировать некоторые части конвейера рендеринга на языках программирования, таких как Ca-подобный GLSL.

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

Еще недавно шейдерные языки не были даже завершены по Тьюрингу.

Термин GPU общего назначения (GPGPU) относится к повышенной программируемости современных графических процессоров.

В модели OpenGL 4 программируются только синие этапы следующей диаграммы:

enter image description here

Источник изображения.

Шейдеры берут входные данные с предыдущего этапа конвейера (например, положения вершин, цвета и растеризованные пиксели) и настраивают вывод на следующий этап.

Два самых важных из них:

  • вершинный шейдер:
    • вход: положение точек в трехмерном пространстве
    • вывод: 2D проекция точек (с использованием 4D матричного умножения). Смотрите: fooobar.com/questions/84610/...
  • фрагментный шейдер:
    • ввод: 2D-положение всех пикселей треangularьника + (цвет краев или текстурное изображение) + параметры освещения
    • вывод: цвет каждого пикселя треangularьника (если он не перекрыт другим более близким треangularьником), обычно интерполированный между вершинами

Шейдер имен не очень описателен для текущих архитектур: "шейдеры" в GLSL также управляют позициями вершин, не говоря уже об OpenGL 4.3 GL_COMPUTE_SHADER, который допускает произвольные вычисления, совершенно не связанные с рендерингом, во многом как OpenCL.

Может ли TODO быть эффективно реализован OpenGL только с помощью OpenCL, то есть сделать все этапы программируемыми? Конечно, между производительностью и гибкостью должен быть компромисс.

Первые графические процессоры с шейдерами использовали различное специализированное оборудование для затенения вершин и фрагментов, поскольку они имеют совершенно разные рабочие нагрузки. Однако в современных архитектурах для всех шейдеров используется один тип оборудования (в основном небольшие процессоры), что экономит некоторое дублирование оборудования. Эта концепция известна как: https://en.wikipedia.org/wiki/Unified_shader_model

enter image description here

Источник изображения.

Чтобы по-настоящему понять шейдеры и все, что они могут сделать, вам нужно посмотреть на множество примеров и изучить API. https://github.com/JoeyDeVries/LearnOpenGL например хороший источник.

В современном OpenGL 4 даже программы hello world triangle используют супер простые шейдеры вместо устаревших устаревших непосредственных API, таких как glBegin и glColor. Вот пример: fooobar.com/questions/83794/...

Одним из классных классных применений нетривиального шейдера являются динамические тени:

Источник изображения.

Ответ 2

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

Вершинный шейдер преобразует каждую трехмерную позицию вершины в виртуальном пространстве (вашу 3d-модель) в 2D-координату, на которой он появляется на экране.

Фрагмент-шейдер в основном дает вам раскраску каждого пикселя, выполняя легкие вычисления.