К содержанию
fohbook/ TouchDesigner
профи

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/iResolutionvUV.st, fragColor остаётся собой. Это самый быстрый способ научиться.

рядом по смыслу