Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在多个网格之间共享一个几何体,并为每个网格应用不同的着色器材质?_Javascript_Three.js_Webgl - Fatal编程技术网

Javascript 是否可以在多个网格之间共享一个几何体,并为每个网格应用不同的着色器材质?

Javascript 是否可以在多个网格之间共享一个几何体,并为每个网格应用不同的着色器材质?,javascript,three.js,webgl,Javascript,Three.js,Webgl,我实例化了一个PlaneGeometry,然后实例化了200个共享此几何体的网格以及它们自己的给定着色器材质实例。以下是代码的简化版本: ... var geom = new THREE.PlaneGeometry(10,10,2,2); var meshes = []; var material=null; for (var i=0 ; i<200 ; i++) { var elevations = getElevations(i); //return an array of 9

我实例化了一个PlaneGeometry,然后实例化了200个共享此几何体的网格以及它们自己的给定着色器材质实例。以下是代码的简化版本:

...
var geom = new THREE.PlaneGeometry(10,10,2,2);
var meshes = [];
var material=null;

for (var i=0 ; i<200 ; i++)
{
   var elevations = getElevations(i); //return an array of 9 values, values are different for each mesh
   var mat = new THREE.ShaderMaterial({
               vertexShader : vsAlti, //process displacement on y coordinate of the vertex
               fragmentShader : fsAlti,
               attributes : { elevation :  { type : 'f',value : elevations }}
            };
   meshes.push(new THREE.Mesh(geometry , mat));
}
...
。。。
var geom=新的三平面几何(10,10,2,2);
var=[];
var-material=null;

对于(var i=0;i请尝试此代码..并让我知道它是如何工作的

var geom = new THREE.PlaneGeometry(10,10,2,2);
var meshes = [];
var material=null;
var attrib = {
     elevations: {
        type: 'f',
        value: []
     }};
for (var i=0 ; i<20 ; i++){

    attrib.elevations.value[i] = (10*i) + 0.25 ; // for example
}
var mat = new THREE.ShaderMaterial({ vertexShader : vsAlti, 
           fragmentShader : fsAlti,
           attributes : attrib });
var mesh = new THREE.Mesh(geometry , mat);
scene.add(mesh)
var geom=新的三个平面几何体(10,10,2,2);
var=[];
var-material=null;
var attrib={
立面图:{
类型:“f”,
值:[]
}};

对于(var i=0;i而言,完全可以共享几何体并同时为每个网格使用不同的材质。您的代码在这方面似乎是正确的。您确定着色器对不同的高程值做出正确反应吗


当您使用两种不同的几何体和两种不同的着色器材质创建两个网格时,它会工作吗?

是的,着色器会正确反应。如果我对每个网格使用不同的几何体,那么它就会工作。我对着色器不是很了解,所以我只是在这里猜测。我认为通常着色器只会影响事物的外观,而不会影响对象图中的任何值,但有可能您的着色器实际更改几何体对象本身的顶点,并且由于它在所有网格之间共享,因此所有着色器都会以相同的方式更改形状。希望对着色器有深入了解的人会查看您的着色器代码并向我们解释这一点。上面的代码没有真正的帮助。它为“高程”属性赋予20个值,而PlaneGeometry由9个顶点组成。实际上,着色器按预期工作,如果我为每个网格创建一个几何体,它就工作了。问题是当我在多个网格之间共享一个几何体时,它们看起来都是一样的。你能在JSFIDLE中共享代码或链接吗?这可能有助于解决这个问题你的问题..我已经用JSFIDLE代码段的链接编辑了这个问题。
var mesh=new THREE.mesh(geometry.clone(),mat);scene.add(mesh)
。这样就可以了。如果遇到任何问题,请告诉我。这样做将复制几何体,其思想是在多个网格之间共享一个几何体实例。正如我前面所说,如果我在每个网格中使用一个几何体实例,它就可以工作。