ключевые слова в GLSL

46

Я не совсем понимаю, как использовать ключевые слова in/ outв GLSL, и Google нехарактерно бесполезен.

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

Буквально каждый учебник, который я нахожу, использует ключевые слова varying/, attributeи это бесполезно.

Avi
источник

Ответы:

65

Спецификаторы хранения inи outфактически имеют цель, которая содержит и заменяет цель varyingи attribute. Они определяют, какие переменные находятся соответственно в путевых и выходных путях для шейдера. См. Стр. 7 справочной карты GLSL 4.2 :

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

Отметим, что последние два вида устарели: их нет в профиле ядра 4.2, только в профиле совместимости.


Что именно они делают?

Что касается использования, возьмите вершинный шейдер от Intro до современного OpenGL. Глава 2.2. Шейдеры :

#version 110

attribute vec2 position;    
varying vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

Это должно быть переписано в ядре 4.2 как:

#version 420

in vec2 position;    
out vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

Бесполезные уроки

Я предполагаю, что основная причина, по которой вы находите «устаревший» учебный код, заключается в том, что не у всех есть доступ к GLSL 3.3+ совместимому оборудованию. Независимо от этого, за хороший и более современный учебник я с радостью укажу вам направление изучения современного трехмерного графического программирования Никола Боласа .

Эрик
источник
2
@NicolBolas Ха! Я уже понял, что с этим что-то подозрительно. Это ошибка в этой справочной карточке. Спасибо! :-)
Эрик