2013-07-22 4 views
11

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

ответ

12

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

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

В прошлом, графические карты были непрограммируемые кусками кремния, который выполняется набором фиксированных алгоритмов: точек/цветы/свет пришел, и 2D-изображение вышло с использованием фиксированного алгоритма (как правило, вдоль https://en.wikipedia.org/wiki/Phong_reflection_model) ,

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

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

Эти языки затем преобразуются в semi-undocumented instruction sets, который работает на небольших «процессорах», встроенных в эти новые графические процессоры.

До недавнего времени языки шейдеров were not even Turing complete.

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

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

enter image description here

Image source.

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

Два наиболее важными из них являются:

  • вершинный шейдер:
    • ввода: положение точек в 3D пространстве
    • выход: 2D проекция точек (с использованием 4D матричного умножения).См: https://stackoverflow.com/a/36046924/895245
  • фрагмента шейдер:
    • ввода: 2D положение всех пикселей треугольника + (цвет ребер или текстуры изображения) + молния параметры
    • выхода: цвет каждого пикселя треугольника (если он не перекрываемого другим более близкого треугольника), как правило, с интерполяцией между вершинами

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

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

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

enter image description here

Image source.

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

В современных OpenGL 4, даже в программах мира треугольника, используются супер простые шейдеры, вместо старых устаревших API-интерфейсов, таких как glBegin и glColor. Вот пример: https://stackoverflow.com/a/36166310/895245

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

Image source.

15

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

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

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

+3

Итак, каждый объект, который мы собираемся нарисовать на экране, проходит через так называемую «Rendering Pipeline», которая состоит из первой вершины, а затем фрагментарного шейдера, которая с вычислением создает общее изображение. Я прав? – Tommz

+3

Да, сначала работает вершинный шейдер, а фрагментарный шейдер работает позже. Конвейер рендеринга имеет несколько других шагов, таких как обрезка, растеризация и т. Д.: Http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314

+0

Что такое пиксельный шейдер? Является ли он синонимом Vertex Shader? – anonymous

Смежные вопросы