Язык затенения OpenGL Различные типы переменных (классификаторы) - PullRequest
12 голосов
/ 01 июня 2011

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

Мои вопросы:

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

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

Ответы [ 3 ]

21 голосов
/ 01 июня 2011

В OpenGL 3+:

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

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

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

Все подробности, которые вы когда-либо хотели бы получить как со стороны GLSL («сервер»), так и со стороны OpenGL («клиент»):

3 голосов
/ 01 июня 2011
  • Uniform: постоянные данные на вызов отрисовки, обычно используемые для параметризации шейдеров.
  • Varying: передача данных между VS и FS с интерполяцией в процессе примитива.
  • Атрибут: это данные атрибута вершины, входные данные вершинного шейдера.Он указан для каждой вершины в примитиве.
2 голосов
/ 01 июня 2011

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

Есть Единые Переменные (статические для всех потоков)

Переменные атрибута (внедренные для каждой вершины)

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

...