Если я правильно понимаю, методы THREE.Geometry, .computeFaceNormals() и .computeVertexNormals(), каждый присваивает значения «врожденному» массиву атрибутов, «нормальному».
Итак, если я хочу использовать обе нормали вершин и граней в одном шейдере, я должен:
- вычислить нормали лица
- клонировать результаты (из «нормалей») в новый массив атрибутов (например, «fNormals»)
- вычислить нормали вершин
- оказывать...
Пока, используя этот подход, я пытаюсь сделать это:
var shader = new THREE.ShaderMaterial(
{
attributes: {
fNormal: { type: "v3", value: [] }
},
//uniforms, vertexShader, etc...
} );
//load a mesh & assign the shader to it...
//setup both vertex & face normals for use in shader
mesh.geometry.computeFaceNormals();
//clone above face-normals to 'fNormal' array:
for (var i=0; i < mesh.geometry.attributes[ 'normal' ].length; i++){
var cloned = mesh.geometry.attributes[ 'normal' ].value[i];
shader.attributes[ 'fNormal' ].value[i] = cloned;
}
//now calculate vertex normals & place them in the 'normal' attribute:
mesh.geometry.computeVertexNormals();
РЕДАКТИРОВАТЬ: Хорошо, понимая некоторые ошибки и редактируя это, когда я отлаживаю. Все еще не уверен, как обращаться с сгенерированными нормалями...
Спасибо за любые идеи-