繁体   English   中英

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

[英]Passing an array of vec2 to shader in THREE.js

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

uniforms: {
    "center":   { type: "v2", value: new THREE.Vector2( 0.5, 0.5 ) },
    "aspectRatio": { type: "f", value: null },
    "radius": { type: "f", value: 0.1 },
    "pointList":  { type: "v2v", value: [] },
},

在我的js脚本中,我按如下方式传递此数组。 这也应该有用,我想:

// Add effects
effect = new THREE.ShaderPass( THREE.MetaBalls2D );
effect.renderToScreen = true;
effect.uniforms[ 'aspectRatio' ].value = window.innerWidth/window.innerHeight;
effect.uniforms[ 'pointList' ].value = pointList //is an array of THREE.Vector2;
composer.addPass( effect );

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

你应该知道你的数组应该是什么最大大小,所以说你有一个数组:

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,并使用它来管理两端的数组。

为了以防万一,我会用一些向量初始化它:

"pointList":  { type: "v2v", value: [ new THREE.Vector2(), new THREE.Vector2() ] },

我认为这是您需要添加到着色器中的内容:

uniform vec2 pointList[2];

另外,如果你想避免Vector2是你可以使用2fv为统一的类型:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM