我使用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上查看相关问题。