Javascript 将vec2数组传递给THREE.js中的着色器

Javascript 将vec2数组传递给THREE.js中的着色器,javascript,arrays,three.js,glsl,shader,Javascript,Arrays,Three.js,Glsl,Shader,我已经在网上搜索了一段时间,但还没有找到正确的答案。 我发现了THREE.js使用的统一类型列表,我认为下面的代码应该是正确的。在最后一行,我定义了一个向量2的统一数组 制服:{ “中心”:{type:“v2”,值:new THREE.Vector2(0.5,0.5)}, “aspectRatio”:{type:“f”,值:null}, “半径”:{类型:“f”,值:0.1}, “点列表”:{类型:“v2v”,值:[]}, }, 在我的js脚本中,我传递这个数组如下。我想这也应该行得通: //

我已经在网上搜索了一段时间,但还没有找到正确的答案。 我发现了THREE.js使用的统一类型列表,我认为下面的代码应该是正确的。在最后一行,我定义了一个向量2的统一数组

制服:{
“中心”:{type:“v2”,值:new THREE.Vector2(0.5,0.5)},
“aspectRatio”:{type:“f”,值:null},
“半径”:{类型:“f”,值:0.1},
“点列表”:{类型:“v2v”,值:[]},
},
在我的js脚本中,我传递这个数组如下。我想这也应该行得通:

//添加效果
效果=新的三个.ShaderPass(三个.MetaBalls2D);
effect.renderToScreen=true;
效果.制服['aspectRatio'].value=window.innerWidth/window.innerHeight;
effect.uniforms['pointList'].value=pointList//是一个由三个向量组成的数组;
作曲家:阿德帕斯(特效);

我现在的问题是,如何从fragmentshader访问此统一变量(本例中为pointList)?

我将使用一些向量对其进行初始化,以防万一:

"pointList":  { type: "v2v", value: [ new THREE.Vector2(), new THREE.Vector2() ] },
我认为这是您需要添加到着色器中的内容:

uniform vec2 pointList[2];
此外,如果要避免
Vector2
s,可以使用
2fv
作为统一类型:

"pointList":  { type: "2fv", value: [ 1, 0,  0, 1 ] }

您应该知道数组的最大大小,因此假设您有一个数组:

var myVec2Array = [
    new THREE.Vector2(),
    new THREE.Vector2(),
    new THREE.Vector2(),
    ...
]
初始化着色器时,可以按照以下方式执行操作:

var myShader = new THREE.ShaderMaterial({
    uniforms:{
        _myVec2UniformArray:{
            type:'v2v',
            value:myVec2Array
        }
    },
    vertexShader: 
        '#define ARRAYMAX '+ myVec2Array.length +'\n' + myVertexShader
}
在myVertexShader中,您将初始化:

uniform vec2 _myVec2UniformArray[ARRAYMAX];

您不必填充阵列,但可以在js中公开ARRAYMAX,并使用它在两端管理阵列

谢谢@mrdoob的回答。因此,如果我理解正确,您只能在预先知道大小的情况下初始化数组?你能不能通过一个int传递点数,然后像这样初始化它:uniform vec2 pointList[size];?因为那正是我需要的。我想将大小从javascript传递到我的着色器。我想您可以执行类似于“#define maxv2s 10\n”+yourlglslshader;然后使用统一的vec2 myv2array[maxv2s],这样您就可以从js定义这个着色器。我认为,你不能动态缩放阵列。2fv看起来很有趣,我以前不知道!问题@pailhead-通过此设置,是否可以使用不同大小的数组发送更新的_myvec2uniformarrayuniform?只要新的数组大小小于ARRAYMAX,它就会工作吗?我认为glsl不会让你调整大小和数组,不确定这到底有什么影响,但你可以通过另一个制服并在击中MAX_之前打破它。谢谢。那玩意儿救了我!只是一个问题,你能用define初始化一个数组吗?像这样:
#定义数组'+myVec2Array+'\n'+myVertexShader