计算法线几何着色器

时间:2013-10-13 13:55:52

标签: opengl glsl geometry-shader

我目前正在编写自己的GLSL着色器,并希望获得平滑的着色。当我计算出将它们发送到VBO的法线时,阴影工作,但问题是当我用骨骼矩阵实现动画时,法线不是核心。

我使用几何着色器来计算法线,但我无法找到如何平滑它们。

这是我的几何着色器:

#version 150

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

in vec2 texCoord0[3];
in vec3 worldPos0[3];

out vec2 texCoord1;
out vec3 normal1;
out vec3 worldPos1;

 void main()
 {

        vec3 n = cross(worldPos0[1].xyz-worldPos0[0].xyz, worldPos0[2].xyz-worldPos0[0].xyz);
        for(int i = 0; i < gl_in.length(); i++)
        {
             gl_Position = gl_in[i].gl_Position;

             texCoord1 = texCoord0;
             normal1 = n;
             worldPos1 = worldPos0;

             EmitVertex();
        }
}

我需要面部旁边的脸,我计算法线,但我不知道如何得到它们。

1 个答案:

答案 0 :(得分:2)

OpenGL中的几何着色器只能访问单个三角形而不能访问整个网格,因此必须从单个三角形计算法线。

这个问题的通常解决方案是为每个顶点计算一次法线并将它们存储在顶点数组中以便于访问。事实证明这更快更简单,因为您不需要在着色器中重新计算任何内容。