我目前正在使用THREE.ShaderMaterial自定义基本的phong材质,并使用三个js的基本块和自定义的片段着色器块中的大多数重建材质。我遇到的问题是three.js中许多部分的#define's,并试图找到正确的方法来设置它们。
在实际的程序中,它是这样的
// Clone the uniforms
var uniforms = THREE.UniformsUtils.clone(shader['uniforms']);
// Set uniform values
uniforms["map"].value = texture;
uniforms["diffuse"].value = new THREE.Color( 0xff0000 );
uniforms["envMap"].value = envMapt;
uniforms["reflectivity"].value = 0.7;
// Create material using shader
var material = new THREE.ShaderMaterial( {
vertexShader: shader['vertexShader'],
fragmentShader: shader['fragmentShader'],
uniforms: uniforms,
lights: true,
//map: true, // These don't seem to do anything
//envMap: true // These don't seem to do anything
} );使用像这样构建的自定义着色器
fragmentShader: [
"#define USE_MAP",
//"#define USE_ENVMAP",
"uniform vec3 diffuse;",
"uniform float opacity;",
.......
"void main() {",
THREE.ShaderChunk[ "alphatest_fragment" ],
THREE.ShaderChunk[ "specularmap_fragment" ],
......
// NDJ - Using custom frag shader
//THREE.ShaderChunk[ "lights_phong_fragment" ],
CustomShaderChunk[ "lights_phong_fragment" ],
......
THREE.ShaderChunk[ "fog_fragment" ],
"}"
].join("\n")通过手动在着色器的开头添加所需的#定义,我可以让它做我想做的事情。然而,这似乎不是设置它的正确方法,而且它也不是很灵活。
类似于this,但我只需要基本定义。我已经尝试通过api和示例来查找如何设置它们,但似乎无法使其工作。
发布于 2012-12-06 08:58:09
完全按照你所描述的去做就行了。下面是一个示例:
ph = new THREE.MeshPhongMaterial( { ambient: 0x000000,
color: 0x0020ff,
specular: 0x2040ff,
shininess: 30,
map: theMap,
side: THREE.DoubleSide } );
ph.defines = {waldo_waldo_three: '(dx+3)', wonke: 7};如果您是谨慎的,那么要小心覆盖任何现有的“定义”对象
https://stackoverflow.com/questions/13717006
复制相似问题