可能是一个简单的问题,但是我正在学习WebGL着色器的工作方式。我的理解是vec4应该由vec4(0.5)或vec4(0.5、0.5、0.5、0.5)或vec4(vec2(0.5),vec2(0.5))组成,例如,为什么这个示例似乎起作用?它在vec2内部包含一个vec4。我也在使用Three.js。
vec4 myVec = vec4(vec2(0.5), vec2(0.5, vec4(0.5)));
但这不起作用:
vec4 myVec = vec4(vec2(0.5), vec2(vec4(0.5), 0.5));
答案 0 :(得分:2)
摘录自this page:
通过这些构造函数也可以将高维向量投射到低维向量:
vec4 a = vec4(-1.0, 2.5, 4.0, 1.0);
vec3 b = vec3(a); // = vec3(-1.0, 2.5, 4.0)
vec2 c = vec2(b); // = vec2(-1.0, 2.5)
通过向这些构造函数提供正确数量的组件,可以将低维向量投射到高维向量:
vec2 a = vec2(0.1, 0.2);
vec3 b = vec3(0.0, a); // = vec3(0.0, 0.1, 0.2)
vec4 c = vec4(b, 1.0); // = vec4(0.0, 0.1, 0.2, 1.0)
所以基本上...
vec2(0.5, vec4(0.5))
之所以有效,是因为在第一个参数0.5之后,仍要从vec4插入一个参数。
vec2(vec4(0.5), 0.5)
不起作用,因为vec2调用的2个参数是从vec4的前2个元素填充的,这意味着不再有要填充的参数,因此后0.5个元素无处可去。
更好的方法是
vec2(0.5, myvec4.x)
和vec2(myvec4.x, 0.5)