我已经成功地让镶嵌控制和评估着色器正常工作,但是我的场景的照明仍然是块状的,因为我一直在计算每个(三角形)面法线,而不是每个顶点。现在我正在使用镶嵌,似乎有必要在 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);
}