一、渲染流水管线总结

《Unity Shader入门精要》读书笔记 之 一

渲染流程可以简单分为三个阶段:应用阶段 → 几何阶段 → 光栅化阶段。


应用阶段:
CPU执行:
CPU为GPU的绘制准备各种“原材料”,如:顶点信息(位置、法向量、UV、颜色等),纹理,材质等,并将这些“原材料”从硬盘经过内存最终拷贝到显存中,并调用DrawCall以通知GPU可以开始绘制。


几何阶段:
GPU执行,分为:
  • 顶点着色器(Vertex Shader)、
  • 曲面细分着色器(Tessellation Shader)、
  • 几何着色器(Geometry Shader)、
  • 裁剪(Clipping)、
  • 屏幕映射(Screen Mapping)

1、Vertex Shader: 顶点变换、顶点着色(高洛德着色)等(模型空间转换为齐次裁剪空间,注意转换后w的值,将用于进行透视除法)。

2、Tessellation Shader: 细分图元。

3、Geometry Shader: 逐图元着色操作,可以产生更多的图元:如在GLSL中通过Geometry Shader显示模型的法线(沿着法向量生成了新的顶点,并连成了line_strip)。
注意:经过了Geometry Shader后,顶点属性的位置会进行透视除法(position.xyz / position.w)而变成NDC坐标系中的位置即(-1, 1)。在Dx中Z的范围为(0, 1)。

4、Clipping:
  • 将不在摄像机视野范围内的顶点裁剪掉,如果切断了某个图元(部分顶点在视野内),则会生成新的顶点,而对于完全不在视野的图元,将直接丢弃。
  • 剔除三角形面片(正面、背面)。

5、Screen Mapping: 将NDC坐标系下的点转换为屏幕坐标系(转换为screen_width, screen_height范围内的坐标,本质上是缩放),注意Z这个时候不会做任何处理,但Z将表示为这个图元的深度,用作光栅化阶段使用。(注意openGL中屏幕的左下角为0,0, 而Dx中左上角为0,0,会导致图像上下翻转的问题)。


光栅化阶段:
GPU执行,主要目的是为了:
  • 计算每个图元覆盖了哪些像素(或屏幕上的像素点都被哪些图元所覆盖了)
  • 每个像素的颜色

光栅化阶段分为:
  • 三角形设置(Triangle Setup)、
  • 三角形遍历(Triangle Traversal)、
  • 片段着色器(Fragment Shader)( Pixel Shader:dx中称为像素着色器)、
  • 逐片元操作(Per-Fragment Operations)(Output-Merge:dx中称为输出合并)
1、Triangle Setup: 接到几何阶段传来的图元数据,注意这是在屏幕空间坐标系下的,这个阶段是为了下个阶段“三角形遍历”做准备。因此这个阶段需要计算出一个三角形所覆盖的区域

2、Triangle Traversal: 也叫作扫描变换,由上个阶段"三角形设置"获取了这个三角形所覆盖的区域,这个阶段将会对这个区域所有的像素进行扫描,用插值法计算每个像素的信息,这些信息所附着的对象称之为“片元(fragment)”。片元所携带的信息包含:插值后的屏幕坐标位置深度纹理坐标法向量等。为下一个阶段"片段着色器"做准备。注意:像素不等同与片元。这个阶段的输出是“(三角形所覆盖的)片元的序列”。

3、Fragment Shader: 这个阶段仍然不能将片元转换为像素。主要是为了计算并输出一个或多个颜色值(多个纹理)。
在这个阶段会进行很多渲染技术,比如最常用的:
  • 纹理采样,用上个阶段的片元信息(插值后的纹理坐标),结合bind的Texture,计算出这个片元的颜色值、或漫反射、高光反射率等。
  • 光照计算,根据片元信息(片元的位置、片元法向量等) 及 其他信息(光源信息、漫反射率、高光反射率、高光系数等)计算(Phong或Blinn-Phong)出这个片元的颜色值。
但是,这个片元对应的像素是否显示这个颜色值,需要在下个阶段"逐片元操作"中确定,因为没准这个片元压根就被挡住了而不会显示。

4、Per-Fragment Operations:
  • 决定片元可见性:
    • 模板测试
    • 深度测试
  • 与颜色缓冲区的颜色进行混合
只有通过了所有测试的片元,才能考虑混合,并最终计算为像素点颜色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值