vec3(1.,1.,1.) 和 (1.,1.,1.) 有什么区别

What is the difference between vec3(1.,1.,1.) and (1.,1.,1.)

我的代码编译没有错误,但是直到我在括号前面添加了 vec3 才起作用。内容是 vec3 组件,所以我假设 GLSL 将其视为矢量,或者如果它不能,则给我一个错误,但它只是接受了它。仅当我删除“-vec3(0.)”时才会出现错误消息(无法从浮点数转换为浮点数的 highp 3 分量向量)。

那么 GLSL 中的 just (...) 是什么意思,为什么在减去 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.);
}

这不是 GLSL 独有的,实际上是很多 C 风格的语言。

vec3 是构造函数,像 vec3(1,2,3) 这样的表达式将参数 1 23 以逗号分隔传递给构造函数,它将依次构造一个向量,其中包含三个初始化为给定参数的组件和 return 它。

(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)。这不是类型转换,因为向量操作上的标量是这样定义的,就像用矩阵转换向量一样不需要将一个转换为另一个。