2014-09-27 2 views
2

Если я правильно понимаю, THREE.Geometry методы, .computeFaceNormals() & .computeVertexNormals(), каждый присваивать значения к 'врожденное' атрибут массива "нормальный".Как перенести нормали Vertex & Face в шейдер Tri.js?

Так что, если я хочу использовать как вершинно & нормалей в лицевой стороне одного шейдера, я должен:

  1. Calculate лицо нормали
  2. клон результаты (от «нормалей») в новый массив атрибутов (т.е. «fNormals»)
  3. подсчет вершинных нормалей
  4. делают ...

До сих пор, используя этот подход, я пытаюсь это:

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(); 

EDIT: Хорошо, понимая некоторые ошибки & редактирования этого, как я отладки. Тем не менее уверены в том, как обращаться сгенерированные нормалей ...

Спасибо за любой insights-

ответ

4

Вы можете получить доступ к рожи нормалей в mesh.geometry.faces[].normal.

for (var i=0; i < mesh.geometry.faces.length; i++){ 
    shader.attributes.fNormal.value[i] = mesh.geometry.faces[i].normal; 
    //I don't think you need to clone the normal vertex here 
} 

Это должно работать, если связать ваш атрибут лица:

attributes: { 
    fNormal: { type: "v3", value: [], boundTo: 'faces' } 
}, 

Вы можете найти пример того, как использовать пользовательские атрибуты в webgl_materials_wireframe

+0

Да, я просто получаю на правильный ответ, когда ваш ответ подтвердил это. Благодаря! До сих пор я не знал о «boundTo». Тем не менее, я смущен: не устанавливает ли массив длины, равный числу лиц, когда мне нужен массив, равный числу вершин? – Jackalope

+1

@Jackalope Вы можете увидеть в ['WebGLRenderer.js # L2211'] (https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L2211), который, когда' boundTo === 'faces'', он фактически использует значение из нормали для всех трех вершин лица. – Volune

Смежные вопросы