Я не являюсь носителем английского языка, и когда я пытаюсь пройти через вики и учебники openGL на www.learnopengl.com, это никогда не заканчивается понятным интуицией, как работает целая концепция. Может кто-нибудь может объяснить мне более абстрактным образом, как это работает? Что такое шейдеры вершин и шейдер фрагмента и для чего мы их используем?Что такое шейдеры в openGL и для чего они нужны?
ответ
OpenGL wiki дает хорошее определение:
шейдер представляет собой определенный пользователем программа, предназначенная для работы на каком-то этапе графического процессора.
В прошлом, графические карты были непрограммируемые кусками кремния, который выполняется набором фиксированных алгоритмов: точек/цветы/свет пришел, и 2D-изображение вышло с использованием фиксированного алгоритма (как правило, вдоль https://en.wikipedia.org/wiki/Phong_reflection_model) ,
Но это было слишком ограничительным для программистов, которые хотели создать много разных визуальных эффектов.
Так как технология развита, производители графических процессоров начали разрешать некоторые части конвейера рендеринга программировать языки программирования, такие как GLSL.
Эти языки затем преобразуются в semi-undocumented instruction sets, который работает на небольших «процессорах», встроенных в эти новые графические процессоры.
До недавнего времени языки шейдеров were not even Turing complete.
Термин GPU общего назначения (GPGPU) относится к этой повышенной программируемости современных графических процессоров.
В модели OpenGL, только синие этапы следующей схеме программируются:
Шейдеры принимают входные данные с предыдущего этапа трубопровода (например, положения вершин, цвета и растровые пиксели) и настраивают выход на следующий этап.
Два наиболее важными из них являются:
- вершинный шейдер:
- ввода: положение точек в 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
Чтобы по-настоящему понять шейдеры и все, что они могут сделать, вам нужно посмотреть на множество примеров и изучить API. https://github.com/JoeyDeVries/LearnOpenGL, например, является хорошим источником.
В современных OpenGL 4, даже в программах мира треугольника, используются супер простые шейдеры, вместо старых устаревших API-интерфейсов, таких как glBegin
и glColor
. Вот пример: https://stackoverflow.com/a/36166310/895245
Классического прохладное применения нетривиальной затенении является динамической тенью:
Шейдеры в основном дают вам правильную окраску объекта, который вы хотите визуализировать, основываясь на нескольких уравнениях света. Поэтому, если у вас есть сфера, свет и камера, тогда камера должна видеть некоторые тени, некоторые блестящие части и т. Д., Даже если сфера имеет только один цвет. Шейдеры выполняют вычисления уравнения света, чтобы дать вам эти эффекты.
Вершинный шейдер преобразует трехмерную позицию каждой вершины в виртуальном пространстве (вашей 3d-модели) в 2D-координату, на которой он появляется на экране.
Фрагментный шейдер в основном дает вам раскраску каждого пикселя, выполняя легкие вычисления.
- 1. TfrmMain и TApplication - для чего они нужны?
- 2. % option noinput nounput: для чего они нужны?
- 3. Что такое вложенные функции? Для чего они?
- 4. Что такое хороший ресурс Silverlight для определения доступных элементов управления и для чего они нужны?
- 5. Обработчики внутри просмотров, для чего они нужны?
- 6. GuidAttribute & ProgId, для чего они нужны?
- 7. Что такое обратные вызовы EJB и зачем они нам нужны?
- 8. OpenGL и GLFW - Мне нужны шейдеры, чтобы нарисовать точку?
- 9. Почему XAML namespaces URI и для чего они нужны?
- 10. Что такое ALL_BUILD и ZERO_CHECK и нужны ли они мне?
- 11. Неразрешенный сервис и характеристики Polar H7 (для чего они нужны?)
- 12. Для чего нужны взгляды?
- 13. OpenGL шейдеры?
- 14. OPENGL местности и тесселяции шейдеры
- 15. OpenGL ES 2.0 и шейдеры
- 16. Шейдеры в WebGL и OpenGL?
- 17. Что такое функторы и зачем они нам нужны?
- 18. PHP: Что такое языковые конструкции и зачем они нам нужны?
- 19. Что такое вершинные и пиксельные шейдеры?
- 20. Отдельные объекты в Jdo/Hibernate - для чего они нужны?
- 21. Для чего нужны установки?
- 22. Для чего нужны файлы tscparams?
- 23. Для чего нужны файлы pg_internal.init?
- 24. Для чего нужны блоки?
- 25. Для чего нужны финалисты?
- 26. Django: Для чего нужны сигналы?
- 27. Для чего нужны точки?
- 28. Python - для чего нужны лямбды?
- 29. равномерные значения и шейдеры OpenGL
- 30. Для чего нужны связующие генераторы?
Итак, каждый объект, который мы собираемся нарисовать на экране, проходит через так называемую «Rendering Pipeline», которая состоит из первой вершины, а затем фрагментарного шейдера, которая с вычислением создает общее изображение. Я прав? – Tommz
Да, сначала работает вершинный шейдер, а фрагментарный шейдер работает позже. Конвейер рендеринга имеет несколько других шагов, таких как обрезка, растеризация и т. Д.: Http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314
Что такое пиксельный шейдер? Является ли он синонимом Vertex Shader? – anonymous