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