需要在几何着色器中对顶点进行曲面细分,以便进行曲面平滑。以下是一个示例代码:
// Vertex Shader
#version 400
in vec3 inPosition;
uniform mat4 MV;
uniform mat4 MVP;
uniform mat3 N;
out vec3 fsNormal;
void main()
{
gl_Position = MVP * vec4(inPosition, 1.0);
vec3 normal = N * inNormal;
fsNormal = normalize(normal);
}
// Tessellation Control Shader
#version 400
layout (vertices = 3) out;
in vec3 fsNormal[];
out vec3 tcNormal[];
uniform float tessLevel = 8.0;
void main()
{
tcNormal[gl_InvocationID] = fsNormal[gl_InvocationID];
gl_TessLevelOuter[0] = tessLevel;
gl_TessLevelOuter[1] = tessLevel;
gl_TessLevelOuter[2] = tessLevel;
gl_TessLevelInner[0] = tessLevel;
}
// Tessellation Evaluation Shader
#version 400
layout (triangles, equal_spacing, ccw) in;
in vec3 tcNormal[];
out vec3 teNormal;
uniform mat4 MVP;
void main()
{
vec3 p1 = gl_TessCoord.x * gl_in[0].gl_Position.xyz;
vec3 p2 = gl_TessCoord.y * gl_in[1].gl_Position.xyz;
vec3 p3 = gl_TessCoord.z * gl_in[2].gl_Position.xyz;
vec4 position = MVP * vec4(p1 + p2 + p3, 1.0);
gl_Position = position;
teNormal = normalize(tcNormal[0] * gl_TessCoord.x + tcNormal[1] * gl_TessCoord.y + tcNormal[2] * gl_TessCoord.z);
}
// Fragment Shader
#version 400
in vec3 teNormal;
out vec4 outColor;
void main()
{
vec3 color = vec3(1.0, 0.0, 0.0);
vec3 lightPosition = vec3(0.0, 10.0, 0.0);
vec3 lightVector = normalize(lightPosition - gl_FragCoord.xyz);
float diffuseIntensity = max(dot(teNormal, lightVector), 0.0);
outColor = vec4(color * diffuseIntensity, 1.0);
}