Спецификаторы хранения 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+ совместимому оборудованию. Независимо от этого, за хороший и более современный учебник я с радостью укажу вам направление изучения современного трехмерного графического программирования Никола Боласа .