WebGL着色器的矢量实例化

时间:2019-12-14 22:23:57

标签: three.js glsl webgl

可能是一个简单的问题,但是我正在学习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));

1 个答案:

答案 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)