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
Graphics ShaderMaterial中的金属性_Graphics_Three.js_Shader - Fatal编程技术网

Graphics ShaderMaterial中的金属性

Graphics ShaderMaterial中的金属性,graphics,three.js,shader,Graphics,Three.js,Shader,我想知道使用着色器材质使用金属性的最佳方法是什么。对于其他threejs材质,我可以添加metalness作为参数,并将其从0修改为1,然后查看结果,但目前我正在努力在ShaderMaterial中实现它。很明显,我遗漏了一些东西,因为根据我对metalness=1的理解,漫反射项为0,镜面反射项为基础颜色。这是迄今为止突出显示的代码(重新创建黄金材质): 然后我更新制服并在片段着色器中进行计算。我已经试着把本地材料的制服合并在一起,但我没法让它发挥作用,我缺少了什么?我很确定标准threejs

我想知道使用着色器材质使用金属性的最佳方法是什么。对于其他threejs材质,我可以添加metalness作为参数,并将其从0修改为1,然后查看结果,但目前我正在努力在ShaderMaterial中实现它。很明显,我遗漏了一些东西,因为根据我对metalness=1的理解,漫反射项为0,镜面反射项为基础颜色。这是迄今为止突出显示的代码(重新创建黄金材质):


然后我更新制服并在片段着色器中进行计算。我已经试着把本地材料的制服合并在一起,但我没法让它发挥作用,我缺少了什么?我很确定标准threejs材料的金属度值指的是我找不到的东西

您是否考虑过扩展内置PBR材料,如
MeshStandardMaterial
via?对于较小的增强,这通常是最好的方法。否则,应使用内置着色器块从头开始创建自定义材质。通过这种方式,您可以重用现有的PBR metalness/糙度着色器代码。这并不是因为我正在处理着色器材质,是否有办法使其与之配合使用?是的,我目前正在尝试使用着色器块,但没有成功。作为一个实例分享您当前的进度如何?现在不可能从共享代码中看出哪里出了问题。有替代JSFIDLE的方法吗?因为我无法让它在某种程度上发挥作用,共享git回购也是一个好主意。
var materialParameters = {
        cdiff_red: 0.0,
        cdiff_green: 0.0,
        cdiff_blue: 0.0,
        cspec_red: 1.022,
        cspec_green: 0.782,
        cspec_blue: 0.344,
        roughness: 0.5,                     
    }       

    var uniforms = {
        cspec: { type: "v3", value: new THREE.Vector3() },
        cdiff: { type: "v3", value: new THREE.Vector3() },
        roughness: { type: "v3", value: new THREE.Vector3() },          
        spotLightPosition: { type: "v3", value: new THREE.Vector3() },
        clight: { type: "v3", value: new THREE.Vector3() },         
    };

    vs = document.getElementById("vertex").textContent;
    fs = document.getElementById("fragment").textContent;

    ourMaterial = new THREE.ShaderMaterial({ uniforms: uniforms, vertexShader: vs, fragmentShader: fs });