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

cdk*_*cdk 5 opengl glsl geometry-shader

我已经成功地让tesselation控件和评估着色器正常工作,但我的场景的光照仍然是块状的,因为我一直在计算每(三角)面法线而不是每个顶点.现在我正在使用tesselation,似乎有必要在tess eval或几何着色器中为新镶嵌的顶点计算新的法线透镜.

为了获得每个顶点法线的平滑,我需要计算共享所讨论顶点的每个三角形的每个面法线,然后计算这些面法线的加权平均值.但我不确定如何在tess eval或几何着色器中获取所有这些三角形面.layout (triangles_adjacency) in几何着色器的选项看起来很有希望,但是关于如何使用它的信息并不多.

是否有可能在GPU上计算平滑的每顶点法线而不使用这种方式使用法线/凹凸贴图?最终目标是使每个顶点光滑平滑,从增加的细分细节水平中获益.

这是我的曲面细分控制和评估着色器:

// control
#version 400

layout (vertices = 3) out;

in vec3 vPosition[];
out vec3 tcPosition[];

const float tessLevelInner = 1.0;
const float tessLevelOuter = 1.0;

void main()
{
    tcPosition[gl_InvocationID] = vPosition[gl_InvocationID];
    if (gl_InvocationID == 0) {
        gl_TessLevelInner[0] = tessLevelInner;
        gl_TessLevelOuter[0] = tessLevelOuter;
        gl_TessLevelOuter[1] = tessLevelOuter;
        gl_TessLevelOuter[2] = tessLevelOuter;
    }
}

// eval
#version 400

layout (triangles, equal_spacing, cw) in;
uniform mat4 uProj;
uniform mat4 uModelView;

in vec3 tcPosition[];
out vec3 tePosition;

void main()
{
    vec3 p0 = gl_TessCoord.x * tcPosition[0];
    vec3 p1 = gl_TessCoord.y * tcPosition[1];
    vec3 p2 = gl_TessCoord.z * tcPosition[2];

    tePosition = p0 + p1 + p2;
    gl_Position = uProj * uModelView * vec4(tePosition, 1);
}
Run Code Online (Sandbox Code Playgroud)