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
2
和 3
以逗号分隔传递给构造函数,它将依次构造一个向量,其中包含三个初始化为给定参数的组件和 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)
。这不是类型转换,因为向量操作上的标量是这样定义的,就像用矩阵转换向量一样不需要将一个转换为另一个。
我的代码编译没有错误,但是直到我在括号前面添加了 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
2
和 3
以逗号分隔传递给构造函数,它将依次构造一个向量,其中包含三个初始化为给定参数的组件和 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)
。这不是类型转换,因为向量操作上的标量是这样定义的,就像用矩阵转换向量一样不需要将一个转换为另一个。