GLSL - 根据顶点法线计算表面法线。

3

我希望在OpenGL上实现平面着色。我搜索了一下,找到了这个问题:如何计算以质心为基础的光照下的平面着色?

我理解了最佳答案的思路,现在正在尝试实现它。然而,我不知道如何根据每个顶点的法向量找到表面法线。

以下是顶点着色器中相关的代码:

#version 400 core

...

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 normal;

uniform mat4 Mm;
uniform mat3 normalMatrix;

out vec3 vertexN;
out vec3 vertexP;

... 

int main() {
     ...
     vertexN = normalize(normalMatrix * normal);
     vertexP = vec3(Mm * position);
     ...
}

几何着色器中相关的代码:

#version 400 core

...
layout (triangles) in;
layout (triangle_strip, max_vertices=3) out;

in vec3 vertexP[3];
in vec3 vertexN[3];

...

void main(){
    ...
    vec3 centroidPosition(0.0);
    for(int i = 0; i < 3; i++) centroidPosition += vertexP[i];
    centroidPosition/=3.0;

    // calculate surface normal
    
    ...
}
1个回答

1
表面法线可以通过计算表面上两个向量的叉积来得到。下面的代码适用于逆时针三角形:
vec3 v1 = vertexP[1] - vertexP[0];
vec3 v2 = vertexP[2] - vertexP[0];
vec3 surfNormal = normalize(cross(v1, v2));

如果三角形的卷绕顺序是顺时针的,你必须交换v1v2
vec3 surfNormal = normalize(cross(v2, v1));

使用点积来确保在混合三角形的绕序时表面法线方向的正确性:

surfNormal *= sign(dot(surfNormal, vertexN[0]+vertexN[1]+vertexN[2]));

1
这个完美地运行了!谢谢。 - user17336748

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接