Подтвердить что ты не робот

Язык затенения OpenGL Различные типы переменных (квалификаторы)

Я пишу программы с использованием OpenGL. Недавно я начал изучать язык затенения OpenGL. Я новичок; поэтому, пожалуйста, детализируйте свои ответы.

Мои вопросы:

  • Что представляют собой различные типы переменных (квалификаторов) в GLSL?
  • Для чего они используются?
  • Как они отличаются друг от друга?

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

4b9b3361

Ответ 1

В OpenGL 3+:

  • varying устарел
  • const для... ну, констант!
  • uniform для каждого вызова (самое большее)
  • in предназначен для ввода с предыдущего этапа конвейера, то есть на максимальные значения вершины (или на фрагмент), на примитив, если используется glAttribDivisor и аппаратное обеспечение
  • out для вывода на следующий этап

Что касается выходов для флеш-шейдеров: в OpenGL3 и выше большинство встроенных переменных для вывода шейдера фрагмента (например, gl_FragColor, с заметным исключением gl_FragDepth) устарели и должны быть заменены на пользовательские, определены переменные out.

Если вы выводите на фреймбуфер по умолчанию, все, что вы объявляете, когда вывод шейдера фрагмента заканчивается в цветовом буфере. Если вы связали FBO с несколькими цветными буферами (т.е. Несколько целей рендеринга), вам необходимо вручную привязать каждую из ваших переменных out к правильному индексу цветового буфера с помощью glBindFragDataLocationIndexed.

Все детали, которые вы могли бы пожелать как для стороны GLSL ( "сервер" ), так и для стороны OpenGL ( "клиент" ), можно найти:

Ответ 2

  • Единообразные: постоянные данные для каждого вызова, обычно используемые для параметризации шейдеров.
  • Варьирование: передача данных между VS и FS, интерполирование по примитиву в процессе.
  • Атрибут: это данные атрибута вершин, входные данные шейдера вершин. Он задан для каждой вершины в примитиве.

Ответ 3

Проверьте учебник: http://www.lighthouse3d.com/tutorials/glsl-tutorial/

существуют единые переменные (статические для всех потоков)

Переменные атрибута (введенные per-vertex)

меняется (как вы знаете)