我的代码编译没有错误,但是直到我在括号前面添加了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.);
}
答案 0 :(得分:2)
这不是GLSL专有的,实际上是许多C风格的语言。
vec3
是一个构造函数,像vec3(1,2,3)
这样的表达式将以逗号分隔的参数1
2
和3
传递给构造函数,该函数将用三个初始化为给定参数的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)
。这不是类型转换,因为矢量操作上的标量是这样定义的,就像通过矩阵转换矢量不需要将一个类型转换为另一个一样。