OpenGL学习总结-基本渲染流程(四)

(未完待续)

接着上章节,本章节以实际代码介绍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);
    // 执行自定义计算任务
}

渲染流程总结:

  1. 顶点着色器将输入顶点处理并变换到裁剪空间。
  2. 可选的细分控制着色器细分评估着色器)细分几何图元。
  3. 可选的几何着色器)可以进一步生成或修改几何体。
  4. 片段着色器对每个光栅化后的片段计算颜色、光照等效果。
  5. 可选的计算着色器)用于非图形的通用计算任务。

        这些着色器一起构成了OpenGL 4.6的管线渲染全流程,每个阶段都可以通过自定义着色器代码实现丰富的视觉效果和计算任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值