在几何着色器中计算每个顶点的法线

我能够在我的几何着色器中计算每个面的法线,但是我想为每个顶点法线计算平滑着色。 我的几何着色器

#version 430 core layout ( triangles ) in; layout ( triangle_strip, max_vertices = 3 ) out; out vec3 normal_out; uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 modelTranslationMatrix; uniform mat4 modelRotationXMatrix; uniform mat4 modelRotationYMatrix; uniform mat4 modelRotationZMatrix; uniform mat4 modelScaleMatrix; void main(void) { // Please ignore my modelMatrix and NormalMatrix calculation here mat4 modelMatrix = modelTranslationMatrix * modelScaleMatrix * modelRotationXMatrix * modelRotationYMatrix * modelRotationZMatrix; mat4 modelViewMatrix = viewMatrix * modelMatrix; mat4 mvp = projectionMatrix * modelViewMatrix; vec3 A = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz; vec3 B = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz; mat4 normalMatrix = transpose(inverse(modelViewMatrix)); normal_out = mat3(normalMatrix) * normalize(cross(A,B)); gl_Position = mvp * gl_in[0].gl_Position; EmitVertex(); gl_Position = mvp * gl_in[1].gl_Position; EmitVertex(); gl_Position = mvp * gl_in[2].gl_Position; EmitVertex(); EndPrimitive(); } 

由于我无法访问相邻的面,因此我无法计算每个顶点的法线。
我怎样才能计算我的几何着色器每个顶点法线?

如果你想平滑的阴影,你不能这样做。

计算每个顶点法线涉及计算每个三角形法线,然后对共享给定顶点的每个三角形平均这些法线(可选地给出每个权重)。

所以你需要额外的信息,你没有:哪个三角形共享每个顶点。

正如你将从三角形与邻接图(见下)看到的,即使这样也不足以计算每个顶点的法线。 以下图中的顶点编号为“2” 应该很明显,可以有任意数量的三角形也可以共享这个顶点,但是不在相邻的集合中。

你将不得不在CPU上计算它们,并添加一个额外的input属性,恐怕。

在这里输入图像说明