【问题标题】:How can I pass both Vertex & Face normals to a Three.js shader?如何将顶点法线和面法线都传递给 Three.js 着色器?
【发布时间】:2014-11-22 02:56:08
【问题描述】:

如果我理解正确,THREE.Geometry 方法,.computeFaceNormals() & .computeVertexNormals(),每个都将值分配给一个“固有”属性数组,“正常”。

所以,如果我想在单个着色器中使用 both 顶点法线和面法线,我必须:

  1. 计算人脸法线
  2. 将结果(从“法线”)克隆到新的属性数组,(即“fNormals”)
  3. 计算顶点法线
  4. 渲染...

到目前为止,我正在使用这种方法:

var shader = new THREE.ShaderMaterial(
    {
        attributes: {
            fNormal: { type: "v3", value: [] }
        },
        //uniforms, vertexShader, etc...
    } );

//load a mesh & assign the shader to it...

//setup both vertex & face normals for use in shader

mesh.geometry.computeFaceNormals();

//clone above face-normals to 'fNormal' array:

for (var i=0; i < mesh.geometry.attributes[ 'normal' ].length; i++){
  var cloned = mesh.geometry.attributes[ 'normal' ].value[i];
  shader.attributes[ 'fNormal' ].value[i] = cloned;
}

//now calculate vertex normals & place them in the 'normal' attribute:
mesh.geometry.computeVertexNormals();

编辑:好的,意识到一些错误并在调试时对其进行编辑。仍然不确定如何处理生成的法线...

感谢您的任何见解-

【问题讨论】:

    标签: javascript three.js glsl shader normals


    【解决方案1】:

    您可以在mesh.geometry.faces[].normal 中访问人脸法线。

    for (var i=0; i < mesh.geometry.faces.length; i++){
        shader.attributes.fNormal.value[i] = mesh.geometry.faces[i].normal;
        //I don't think you need to clone the normal vertex here
    }
    

    如果您将属性绑定到面,这应该可以工作:

    attributes: {
        fNormal: { type: "v3", value: [], boundTo: 'faces' }
    },
    

    您可以在webgl_materials_wireframe中找到如何使用自定义属性的示例

    【讨论】:

    • 是的,当您的回答确认时,我刚刚走上正轨。谢谢!直到现在我才知道“boundTo”。尽管如此,我还是很困惑:当我需要一个等于顶点数的数组时,这不是设置了一个长度等于面数的数组吗?
    • @Jackalope 您可以在WebGLRenderer.js#L2211 中看到,当boundTo === 'faces' 时,它实际上对面的所有三个顶点使用法线值。
    猜你喜欢
    • 2014-11-02
    • 2012-08-15
    • 2013-02-03
    • 2020-05-26
    • 2017-10-17
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多