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
Three.js 仅将Perlin噪波着色器应用于网格内的某些对象_Three.js_Glsl_Webgl_Shader - Fatal编程技术网

Three.js 仅将Perlin噪波着色器应用于网格内的某些对象

Three.js 仅将Perlin噪波着色器应用于网格内的某些对象,three.js,glsl,webgl,shader,Three.js,Glsl,Webgl,Shader,我想使用柏林噪波修改网格中的一个对象。我现在是怎么做的 我正在创建对象并将其添加到三维对象 spheres = new THREE.Object3D(); for ( var i = 0; i < 40; i ++ ) { var ball = new THREE.Mesh(new THREE.SphereGeometry(20,20,20), material); ball.position.x = Math.random() * 600 - 300;

我想使用柏林噪波修改网格中的一个对象。我现在是怎么做的

  • 我正在创建对象并将其添加到三维对象

     spheres = new THREE.Object3D();
     for ( var i = 0; i < 40; i ++ ) {
         var ball = new THREE.Mesh(new THREE.SphereGeometry(20,20,20), material);
         ball.position.x = Math.random() * 600 - 300;
         ball.position.y = Math.random() * 600 - 300;
         ball.position.z = Math.random() * 600 - 300;
         spheres.add(ball);
    }
    scene.add(spheres);
    

  • 着色器材质适用于所有40个球,没有问题。我想做的是更改
    spheres.children[0]
    的着色器。是否可以更改一个对象的柏林噪波值(noiseMax),或者它是否会自然影响使用该材质的所有对象的材质?

    您有两个选项

    简单的方法是为每个不同的项目创建和使用单独的ShaderMaterial,并且可以轻松设置其一致性。e、 g

    var firstMaterial = new THREE.ShaderMaterial({
        uniforms: { noisemax: { type: 'f', value: 3}}
    });
    
    var secondMaterial = new THREE.ShaderMaterial({
        uniforms: { noisemax: { type: 'f', value: 10}}
    });
    
    var firstBall = new THREE.Mesh(new THREE.SphereGeometry(20,20,20), firstMaterial);
    var secondBall = new THREE.Mesh(new THREE.SphereGeometry(20,20,20), secondMaterial);
    
    // or in your case
    spheres.children[0].material = secondMaterial;
    
    或者,对于您的情况(至少从性能角度来看),最好是将noisemax更改为属性,这样每个对象都可以有一个单独的值

    必须记住,属性是逐顶点的,因此需要复制属于每个对象的所有顶点的值。这会使事情变得复杂一点


    编辑:为了减少内存使用,您可以使用

    这是一个好问题。你试过了吗?在过去的几天里,我也一直在玩着色器,如果你感兴趣的话,我已经开始写一篇关于它的帖子。谢谢Brendan。我想我确实试过了,但没用。我会再试一次,然后再给你回复,否则我会尝试属性方式。Brendan有没有关于属性与多个材质的阅读建议?
    var firstMaterial = new THREE.ShaderMaterial({
        uniforms: { noisemax: { type: 'f', value: 3}}
    });
    
    var secondMaterial = new THREE.ShaderMaterial({
        uniforms: { noisemax: { type: 'f', value: 10}}
    });
    
    var firstBall = new THREE.Mesh(new THREE.SphereGeometry(20,20,20), firstMaterial);
    var secondBall = new THREE.Mesh(new THREE.SphereGeometry(20,20,20), secondMaterial);
    
    // or in your case
    spheres.children[0].material = secondMaterial;