Three.js Phong着色器材质参数/设置定义

Three.js Phong着色器材质参数/设置定义,three.js,Three.js,我目前正在使用THREE.ShaderMaterial自定义基本phong材质,并使用三个js的基本块和一个自定义的片段着色器块重建材质。我遇到的问题是three.js的许多部分中的#define的,并试图找到正确的方法来设置它们 在实际的程序中是这样的 // Clone the uniforms var uniforms = THREE.UniformsUtils.clone(shader['uniforms']); // Set uniform values uniforms["map"]

我目前正在使用
THREE.ShaderMaterial
自定义基本phong材质,并使用三个js的基本块和一个自定义的片段着色器块重建材质。我遇到的问题是three.js的许多部分中的
#define的
,并试图找到正确的方法来设置它们

在实际的程序中是这样的

// 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")
使用像这样构建的自定义着色器

// 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")
通过在着色器的开始处手动添加所需的#定义,我可以让它执行我想要的操作。然而,这似乎不是正确的设置方式,也不是很灵活


类似于,但我只需要基本定义。我试着浏览api和示例,以找到如何设置这些,但似乎无法使其正常工作。

只需按照您描述的方式执行即可。以下是一个示例:

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};
如果您很谨慎,请小心覆盖任何现有的“定义”对象