1

我目前正在编写自己的 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();
        }
}

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

4

1 回答 1

2

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

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

于 2013-10-13T14:19:50.227 回答