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

时间:2019-04-10 01:04:48

标签: webgl glsles

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

那么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.);
}

1 个答案:

答案 0 :(得分:2)

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

vec3是一个构造函数,像vec3(1,2,3)这样的表达式将以逗号分隔的参数1 23传递给构造函数,该函数将用三个初始化为给定参数的componenet构造一个向量,并将其返回。

(1,2,3)的情况下,逗号不是分隔符,而是运算符,在此特定情况下,{}使它成为指令列表,最后一条指令的结果传播到外部。 1}}。如果要写3,结果将是(1,2,3) + 5。您可以在wikipedia上了解有关逗号运算符和一些常见用例的更多信息。

现在是GLSL的特定部分:

8的结果为(1.,2.,3.)-vec3(0),因为GLSL与向量数学有关,因此这是有效的向量标量运算,导致将标量运算应用于向量的各个分量。在这种情况下,这与编写3.-vec3(0)相同。另一个示例是vec3(3.-0.,3.-0.,3.-0.),其结果为5.*vec3(2,3,4) => vec3(2*5,3*5,4*5)。这不是类型转换,因为矢量操作上的标量是这样定义的,就像通过矩阵转换矢量不需要将一个类型转换为另一个一样。