В чем разница между vec3 (1., 1., 1.) И (1., 1., 1.) - PullRequest
0 голосов
/ 10 апреля 2019

Мой код скомпилирован без ошибок, но не работал, пока я не добавил vec3 перед скобками. Содержимое было компонентами vec3, поэтому я бы предположил, что GLSL рассматривает его как вектор, или выдает ошибку, если не может, но только что принял ее. Сообщение об ошибке ( не может преобразовать из плавающего в верхний 3-компонентный вектор с плавающей точкой ) появляется только в том случае, если я удаляю «-vec3 (0.)».

Так что же означает просто (...) в GLSL и почему оно молча принимается при вычитании vec3?

Примеры:

//this works:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy/iResolution.xy;
    vec3 col = vec3(uv.x, uv.y, 0.)-vec3(0.);

    fragColor = vec4(vec3(col), 1.);
}

.

//this doesn't:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy/iResolution.xy;
    vec3 col = (uv.x, uv.y, 0.)-vec3(0.);

    fragColor = vec4(vec3(col), 1.);
}

.

//this gives the helpful error message
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy/iResolution.xy;
    vec3 col = (uv.x, uv.y, 0.);

    fragColor = vec4(vec3(col), 1.);
}

1 Ответ

2 голосов
/ 12 апреля 2019

Это не только для GLSL, но на самом деле много языков стиля C.

vec3 является конструктором, выражение типа vec3(1,2,3) передает аргументы 1 2 и 3, разделенные запятой, функции конструктора, которая, в свою очередь, создаст вектор с тремя компонентами, инициализированными для заданные параметры и вернуть его.

В случае (1,2,3) запятая действует не как разделитель, а как оператор, превращая его в список инструкций, где результат последней инструкции распространяется наружу, в данном конкретном случае 3. Если бы вы написали (1,2,3) + 5, результат был бы 8. Вы можете прочитать больше об операторе запятой и некоторых типичных случаях использования в wikipedia .

Теперь перейдем к специфической части GLSL:

(1.,2.,3.)-vec3(0) приводит к 3.-vec3(0), поскольку GLSL полностью относится к векторной математике, это допустимая векторно-скалярная операция, в результате чего скалярная операция применяется к отдельным компонентам вектора. в этом случае это то же самое, что и запись vec3(3.-0.,3.-0.,3.-0.). Другим примером будет 5.*vec3(2,3,4), что приведет к vec3(2*5,3*5,4*5) => vec3(10,15,20). Это не приведение типа, поскольку скалярные операции над вектором определены как таковые, точно так же, как преобразование вектора с помощью матрицы не требует преобразования одного в другой.

...