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;