(未完待续)
接着上章节,本章节以实际代码介绍OPenGL渲染管线各环节的效果和作用。

以下是管线渲染的主要着色器阶段,以及每个阶段的功能和示例:
1. 顶点着色器(Vertex Shader)
功能:
- 处理每个输入的顶点。
- 进行顶点变换,如从模型空间到裁剪空间的变换(比如视图变换、投影变换)。
- 计算顶点相关属性(如法线、纹理坐标等),将数据传递到后续阶段。
示例:
#version 460 core
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
out vec3 fragNormal;
void main() {
fragNormal = mat3(transpose(inverse(model))) * inNormal; // 法线变换
gl_Position = projection * view * model * vec4(inPosition, 1.0); // 变换到裁剪空间
}
2. 细分控制着色器(Tessellation Control Shader, TCS) (可选)
功能:
- 控制细分曲面,决定输入的顶点数量如何被细分。
- 配合细分评估着色器一起使用,控制几何体的细分等级。
示例:
#version 460 core
layout(vertices = 3) out; // 输出3个顶点用于三角形细分
void main() {
if (gl_InvocationID == 0) {
gl_TessLevelInner[0] = 3.0; // 内部细分级别
gl_TessLevelOuter[0] = 2.0; // 外部边缘细分
gl_TessLevelOuter[1] = 2.0;
gl_TessLevelOuter[2] = 2.0;
}
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
3. 细分评估着色器(Tessellation Evaluation Shader, TES) (可选)
功能:
- 根据TCS设置的细分级别,计算新生成顶点的位置。
- 处理几何体的曲面细分。
#version 460 core
layout(triangles, fractional_odd_spacing) in;
void main() {
vec3 pos = (gl_TessCoord.x * gl_in[0].gl_Position.xyz) +
(gl_TessCoord.y * gl_in[1].gl_Position.xyz) +
(gl_TessCoord.z * gl_in[2].gl_Position.xyz);
gl_Position = vec4(pos, 1.0);
}
4. 几何着色器(Geometry Shader) (可选)
功能:
- 在顶点组装后运行,处理几何体的生成或变换。
- 例如,根据输入的顶点生成新的几何体,如扩展成点、线、三角形等。
#version 460 core
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
void main() {
for (int i = 0; i < 3; ++i) {
gl_Position = gl_in[i].gl_Position; // 直接传递顶点
EmitVertex(); // 生成顶点
}
EndPrimitive(); // 结束当前图元
}
5. 片段着色器(Fragment Shader)
功能:
- 对每个光栅化后的片段(像素)进行处理。
- 主要用于计算颜色、光照、纹理采样等效果。
示例:
#version 460 core
in vec3 fragNormal;
out vec4 fragColor;
uniform vec3 lightDir;
void main() {
float brightness = max(dot(normalize(fragNormal), normalize(lightDir)), 0.0);
fragColor = vec4(vec3(brightness), 1.0); // 根据光照计算颜色
}
6. 计算着色器(Compute Shader) (可选)
功能:
- 独立于图形管线,执行通用计算任务(如物理仿真、粒子系统等)。
- 不需要依赖固定渲染管线,可以单独调度。
示例:
#version 460 core
layout(local_size_x = 16, local_size_y = 16) in;
void main() {
ivec2 id = ivec2(gl_GlobalInvocationID.xy);
// 执行自定义计算任务
}
渲染流程总结:
- 顶点着色器将输入顶点处理并变换到裁剪空间。
- (可选的细分控制着色器和细分评估着色器)细分几何图元。
- (可选的几何着色器)可以进一步生成或修改几何体。
- 片段着色器对每个光栅化后的片段计算颜色、光照等效果。
- (可选的计算着色器)用于非图形的通用计算任务。
这些着色器一起构成了OpenGL 4.6的管线渲染全流程,每个阶段都可以通过自定义着色器代码实现丰富的视觉效果和计算任务。
&spm=1001.2101.3001.5002&articleId=142989893&d=1&t=3&u=b7ee990e751b4295b9620e90aa9441a6)
1175

被折叠的 条评论
为什么被折叠?



