在您的地形材质中,设置 wireframe = true ,你将能够看到发生了什么。
wireframe = true
你的代码和纹理基本上都很好。在加载程序回调函数中计算顶点法线时会发生此问题。
几何体外环的计算顶点法线略微向外。这很可能是因为 computeVertexNormals() 它们是通过对每个相邻面的面法线求平均来计算的,并且模型“边”的面法线(黑色部分)被平均到构成“上限”外圈的那些顶点的顶点法线计算中”。
computeVertexNormals()
结果,“帽”的外环在位移图下向外扩展。
编辑:果然,直接从你的模型,外环的顶点法线向外指向。内环的顶点法线都是平行的。也许Blender使用相同的逻辑来生成顶点法线 computeVertexNormals() 确实。
问题是你的对象是如何构造的,因为沿着法向量发生位移。
代码在这里。
https://github.com/mrdoob/three.js/blob/master/examples/js/ShaderTerrain.js#L348-350
"vec3 dv = texture2D( tDisplacement, uvBase ).xyz;",
这需要位移纹理的rgb向量。
"float df = uDisplacementScale * dv.x + uDisplacementBias;",
这只取矢量的红色值,因为uDisplacementScale通常为1.0,uDisplacementBias为0.0。
"vec3 displacedPosition = normal * df + position;",
这取代了法线向量的位置。
所以要解决你更新法线或着色器。