Я закончил monkeyPatching вершинного шейдера MeshNormalMaterial
и удалил логику, что нормали относительно камеры, вот окончательный код:
import * as THREE from 'three'
import normalVert from 'three/src/renderers/shaders/ShaderLib/normal_vert.glsl'
// like MeshNormalMaterial, but the normals are relative to world not camera
const normalMaterialGlobalvert = normalVert.replace(
'#include <defaultnormal_vertex>',
THREE.ShaderChunk['defaultnormal_vertex'].replace(
'transformedNormal = normalMatrix * transformedNormal;',
// take into consideration only the model matrix
'transformedNormal = mat3(modelMatrix) * transformedNormal;'
)
)
И затем используйте его как:
mesh.material = new THREE.ShaderMaterial({
vertexShader: normalMaterialGlobalvert,
fragmentShader: `
varying vec3 vNormal;
void main() {
gl_FragColor = vec4(vNormal, 1.0);
}
`,
})
Спасибо Гман за указание мне в правильном направлении!