THREE.BufferGeometry - 顶点法线和面法线

Posted

技术标签:

【中文标题】THREE.BufferGeometry - 顶点法线和面法线【英文标题】:THREE.BufferGeometry - vertex normals and face normals 【发布时间】:2016-02-04 15:20:53 【问题描述】:

THREE.BufferGeometry 的文档中写道:

正常(itemSize:3) 存储此几何中每个顶点的面或顶点法线向量的 x、y 和 z 分量。由 .fromGeometry() 设置。

这个变量什么时候保存vertex法线,什么时候face法线?

是否像使用THREE.MeshMaterial 时将法线解释为面法线一样简单,而使用THREE.LineMaterial 时将法线用作顶点法线?还是比那更复杂。

我还了解到THREE.FlatShading 可用于渲染具有平面阴影的网格(面法线指向外侧)。

geometry = new THREE.BoxGeometry( 1000, 1000, 1000 );

material = new THREE.MeshPhongMaterial( 
    color: 0xff0000, 
    shading: THREE.FlatShading
);

mesh = new THREE.Mesh( geometry, material );

我想说法线不再需要了。在这种情况下,为什么我的缓冲区几何图形由例如 THREE.BoxGeometry 制成仍然具有正常属性?此信息是否仍用于渲染,或者将它们从缓冲区几何图形中删除是否是一种可能的优化?

【问题讨论】:

缓冲区几何没有“面法线”,只有顶点法线,三角形面上的点法线由 gpu 从其顶点插值...不知道您不想要它们,您可以在之后删除它们或创建自己的 BoxGeometry 如果您的着色器不使用它们(尝试观察控制台以获取警告或阅读着色器代码),自动删除它们会出现问题,因为您可以使用另一个对象中的几何图形与其他材料等 @DerteTrdelnik 你能把它作为答案发布吗?然后我可以关闭问题。 【参考方案1】:

BufferGeometry 法线是向量法线,着色器从属于该面的顶点(在大多数情况下为三角形)为每个片段插入法线值

当您转换默认计算法线的THREE.BoxGeometry 时,即使在BufferGeometry 转换输出中,它们也会保持设置,因为几何无法“知道”您是否需要法线或任何属性(材料程序决定使用哪些属性)

您可以使用 geometry.removeAttribute("normal") 删除法线

【讨论】:

以上是关于THREE.BufferGeometry - 顶点法线和面法线的主要内容,如果未能解决你的问题,请参考以下文章

向顶点着色器提供顶点参数

顶点以及顶点缓冲区

我的OpenGL学习进阶之旅顶点属性顶点数组

我的OpenGL学习进阶之旅顶点属性顶点数组

在顶点着色器中定位顶点后如何更新法线?

从顶点数据中传入顶点位置和顶点颜色