GLSL: свой шейдер
Когда цепочка узлов дороже одной формулы: GLSL TOP, uniforms и минимальный рабочий шейдер.
GLSL TOP даёт писать код, который выполняется на видеокарте для каждого
пикселя. Это дешевле десятка узлов, делающих ту же математику, и открывает
то, чего нет в готовых операторах.
Минимальный шейдер
GLSL TOP создаётся вместе с двумя Text DAT: вершинным и пиксельным
шейдером. Правится обычно только пиксельный.
out vec4 fragColor;
void main()
{
vec2 uv = vUV.st; // координата пикселя 0..1
float d = length(uv - 0.5); // расстояние от центра
float c = smoothstep(0.5, 0.0, d);
fragColor = vec4(c, c, c, 1.0);
}
vUV.st — координата текущего пикселя. fragColor — что записать.
Всё остальное — обычная математика.
Входы
Картинки со входов доступны как sTD2DInputs[0], sTD2DInputs[1] и так
далее:
vec4 src = texture(sTD2DInputs[0], vUV.st);
vec4 mask = texture(sTD2DInputs[1], vUV.st);
fragColor = src * mask.r;
Uniforms — параметры снаружи
На странице Vectors у GLSL TOP объявляются переменные, которые приходят
из TouchDesigner. Имя, тип, значение (можно выражением или
экспортом из CHOP).
uniform float uSpeed;
uniform vec3 uColor;
void main() {
float t = uSpeed * 0.1;
fragColor = vec4(uColor * sin(t + vUV.s * 20.0), 1.0);
}
Так шейдер становится обычным оператором с параметрами, а не куском кода с зашитыми числами.
Compute-шейдеры и вычисления
GLSL TOP умеет режим Compute; GLSL MAT пишет материал для рендера;
для геометрии в 2025-й версии есть POP, которые закрывают
большую часть того, ради чего раньше писали вычислительные шейдеры.
Когда писать шейдер, а когда не надо
Стоит:
- одна формула вместо цепочки из шести-десяти полноэкранных узлов;
- алгоритм, которого нет в операторах (SDF, raymarching, свои проекции);
- операция, где важно за один проход прочитать несколько текстур.
Не стоит:
- когда это делается тремя стандартными узлами;
- когда шейдер писать будет один человек, а поддерживать — другой;
- ради «правильности»: сеть из операторов читается и правится быстрее.
Текст ошибки виден в Info DAT на GLSL TOP и в Textport. Номер строки
считается по итоговому коду, в который TouchDesigner добавляет свои
объявления сверху — поэтому строка в сообщении обычно на несколько больше,
чем у вас.
Шейдеры с Shadertoy переносятся в TouchDesigner почти дословно: iTime →
uniform от absTime.seconds, fragCoord/iResolution → vUV.st,
fragColor остаётся собой. Это самый быстрый способ научиться.