Wilt
Wilt

Reputation: 44326

THREE.BufferGeometry - vertex normals and face normals

In the documentation for THREE.BufferGeometry is written:

normal (itemSize: 3)
Stores the x, y, and z components of the face or vertex normal vector of each vertex in this geometry. Set by .fromGeometry().

When is this variable holding vertex normals and when face normals?

Is it as simple as if a THREE.MeshMaterial is used the normals are interpreted as face normals and when a THREE.LineMaterial is used the normals are used as vertex normals? Or is it more complicated then that.

I also understood that THREE.FlatShading can be used for rendering a mesh with flat shading (face normals point straight outward).

geometry = new THREE.BoxGeometry( 1000, 1000, 1000 );

material = new THREE.MeshPhongMaterial({ 
    color: 0xff0000, 
    shading: THREE.FlatShading
});

mesh = new THREE.Mesh( geometry, material );

I would say normals are not necessary any more. Why are my buffer geometries made from for example a THREE.BoxGeometry still holding a normal attribute in such case? Is this information still used for rendering or would removing them from the buffer geometry be a possible optimization?

Upvotes: 0

Views: 4772

Answers (1)

Derte Trdelnik
Derte Trdelnik

Reputation: 2706

BufferGeometry normals are vector normals and shader interpolates normal value for each fragment from vertices belonging to that face (in most cases triangle)

when you convert THREE.BoxGeometry which has normals computed by default, they stay set up even in the BufferGeometry conversion output, as geometry does not have any way to "know" whether you need normals or any of the attributes (material program decides what attributes are used)

you can remove the normals with geometry.removeAttribute("normal")

Upvotes: 1

Related Questions