BufferGeometry始终创建FlatShading法线.我需要SmoothShading



我使用ThreeJS r68。

我总是在我的项目中使用THREE.Geometry,它运行得很好。现在我想从THREE.Geometry改为THREE.BufferGeometry,因为我读到这是更好的选择。但是我无法让SmoothShading使用我的THREE.BufferGeometry

我将对象加载到BufferGeometry中并调用bufferGeometry.computerVertexNormals。然后我的结果是FlatShading。

我在computeVertexNormals()方法中读到,如果我使用"index"属性,BufferGeometry的计算方式会有所不同。我试图创建一个"索引"BufferGeometry,但这只会让一切变得更糟。我不知道我是不是创造了这种权利。我只是添加了索引,就像在普通几何体中将它们添加到面上一样。BufferGeometry.fromGeometry()方法不创建索引的BufferGeometry,所以我不知道在哪里查找。

是否需要为SmoothShading编制索引的BufferGeometry?

更新

[…一段时间后……]

我想我现在可以创建一个索引THREE.BufferGeometry了。它更像是几何体。使用索引的BufferGeometry,平滑着色看起来很好。所以现在我有了SmoothShading,但一个无效的uv贴图。但是,为什么索引的BufferGeometry中的uv贴图与未索引的Buffer几何体中的uv映射不同呢?BufferGeometry确实不容易加载。

好。

这是我得到的:

1.)SmoothShading仅适用于索引THREE.BufferGeometry。(据我所知)不适用于无索引的BufferGeometry。

2.)索引的THREE.BufferGeometry每个顶点只有1个uv点,而每个面顶点没有1个uv点将
这意味着,如果你有一个有4个点的正方形,那么你只有4个uv点,而不是像THREE.Geometry和非索引THREE.BufferGeometry那样有6个。(这是令人困惑的,不允许复杂的紫外线地图)

更新

[…几个小时后的睡眠…]

我又看了THREE.BufferGeometry.computerVertexNormals()。我必须改正自己。

索引THREE.BufferGeometry:

1) 每个顶点仅1个uv
2) 每个顶点只有1个法线
结果:
-只能使用smoothShading
-只有简单的uv贴图
-限制为65.535个顶点。

无索引THREE.BufferGeometry:

1) 每个面顶点1个uv
2) 每个面顶点1个法线
结果:
-在ThreeJS(r68)中计算法线:仅FlatShading
-计算ThreeJS之外的法线并导入法线:FlatShading和SmoothShading
-复杂的紫外线图可能的

您可以将THREE.FlatShading应用于材质以获得平面着色索引THREE.BufferGeometry。在这种情况下,根本不需要定义任何法线。

这为您节省了很多麻烦和开销:

geometry = new THREE.BufferGeometry
material = new THREE.MeshPhongMaterial({ 
    color: 0xff0000, 
    shading: THREE.FlatShading
});
mesh = new THREE.Mesh( geometry, material );

网格将渲染为平面着色。这对THREE.MeshLambertMaterial还不起作用。但他们正在努力。请在GitHUB上查看相关问题。

相关内容

  • 没有找到相关文章

最新更新