Shader|GPU流水线

  1. Shader运行于GPU上。
  2. Shader的类型主要有:顶点着色器(Vertex Shader)、细分曲面着色器(Tessellation Shader)、几何着色器(Geometry Shader)、像素着色器(Pixel Shader)、Computer Shader。
    
     

Shader|GPU流水线


 
  • 顶点着色器(Vertex Shader):流水线的第一个阶段,它的输入来自于CPU.
  1. 顶点着色器的处理单位是顶点,也就说输入进来的每个顶点都会调用一次顶点着色器。
  2. 顶点着色器本身不会创建或者销毁任何顶点,而且无法得到顶点与顶点之间的关系。但正是因为这样的相互独立性,GPU可以利用本身的特性并行化处理每一个顶点。这意味着这一阶段的处理速度会很快。
  3. 顶点着色器的基本功能就是坐标变换与逐顶点光照。即把模型的顶点坐标从模型空间转换到齐次剪裁空间中(o.pos=mul(UNITY_MVP,v.position);),同时还可以计算和输出顶点的颜色。
  • 细分曲面着色器(Tessellation Shader):可选的着色器
  1. 细分曲面着色器(Tessellation Shader)可以使用一个新的几何图元类型,称为patch(斑点、碎片),来生成一个三角形网格。
  2. 细分曲面着色器(Tessellation Shader)分为细分曲面控制着色器(Hull Shader)与细分曲面计算着色器(Domain Shader)。
  3. Hull Shader对patch顶点进行操作,并指定从patch中应该生成多少几何图形。
  4. Domain Shader使用细分曲面坐标来放置所生成的顶点,并且将它们发送到光栅化器,或发送到几何着色器做进一步处理。
  • 几何着色器(Geometry Shader):可选的着色器
  1. 可以被用于执行逐图元(Per-Primitive)的着色操作或者用于产生更多的图元。
  2. 几何着色器在启用后,它将从顶点着色器获得一个基础图元作为输入的基本图形类型,通过对输入的顶点进行处理,几何着色器将决定输出的图元类型和个数。当输出的图元减少或者不输出时,实际上起到了裁剪图形的作用,当输出的图元类型改变或者输出更多图元时起到了产生和改变图元的作用。
  3. 几何着色器有意思的地方在于它可以把(一个或多个)顶点转变为完全不同的基本图形(primitive),从而生成比原来多得多的顶点。
  • 裁剪(我的理解:这一步包括图元装配):
  1. 图元装配,即将顶点根据primitive(原始的连接关系)还原成网格结构。网格由顶点和索引组成,在之前流水线中是对顶点的处理,在这个阶段是根据索引将顶点连接在一起,组成线、面单元。之后就是对超出屏幕外的三角形进行裁剪。
  2. 这一步是不可编程的,即我们无法通过编程来控制裁剪的过程,而是硬件上的固定操作,但我们可以自定义一个裁剪操作来对这一步进行配置。
  3. 一个图元和摄像机视野的关系有三种:完全在视野内、部分在视野内、完全在视野外。完全在视野内的图元会继续传递给下一个流水线阶段;完全在是野外的图元不会继续向下传递,因为他们不需要被渲染;部分在视野内的图元就需要裁剪。
  4. 裁剪时,新的顶点会被生成,在视野外的顶点会被舍弃。
    

Shader|GPU流水线

  • 屏幕映射
  1. 这一步输入的坐标仍然是三维坐标系下的坐标(范围在单位立方体内)。
  2. 屏幕映射的任务就是把每个图元的x和y坐标转换到屏幕坐标系下。
  3. 屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。
  4. OpenGL屏幕左下角为(0,0)点;DirectX屏幕左上角为(0,0)点。
  5. 将屏幕坐标系下的顶点位置以及和它们相关的额外信息,如深度值(z坐标)、法线方向、视觉方向等输出到下一阶段。
  • 三角形设置:进入光栅化阶段
  1. 输入上一阶段输出的三角形网格的顶点。
  2. 计算光栅化一个三角网格所需要的信息。
  • 三角形遍历,也称扫描变换
  1. 检查每个像素是否被一个三角网格所覆盖。如果被覆盖,就会生成一个片元。
  2. 一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。这些状态包含了(但不限于)它的屏幕坐标、深度信息,以及其他从几何阶段出输出的顶点信息,例如法线、纹理坐标等。
    

Shader|GPU流水线

         三个顶点的深度进行插值得到其重心位置对应的片元的深度值为-10.0
 
  • 片元着色器(Fragment Shader)、(Pixel Shader,像素着色器)
  1. 完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。
  2. 为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,经过上述一系列过程得到其覆盖的片元的纹理坐标。
  3. 局限在于:仅可以影响单个片元,不可以将自己的任何结果直接发送给它的邻居们。(有一情况例外,片元着色器可以访问到导数信息)
    

Shader|GPU流水线

            根据上一步插值后的片元信息,片元着色器计算该片元的输出颜色
 
  • 逐片元操作,或者称输出合并阶段:渲染流水线的最后一步。该阶段是高度可配置的。
  1. 决定每一个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等。
  2. 如果一个片元通过了所有的测试,那么把该片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者是混合。
  3. 只有通过了所有的测试后,新生成的片元才能和颜色缓冲区中已经存在的像素颜色进行混合,最后再写入颜色缓冲区中。
  4. 模板测试:用于限制渲染的区域,另外,还有更高级的用法:渲染阴影、轮廓渲染等。不管一个片元有没有通过模板测试,我们都可以根据模板测试和下面的深度测试结果来修改模板缓冲区。
  5. 深度测试:离摄像机距离的一个测试。如果一个片元没有通过深度测试,它就没有权利更改深度缓冲区中的值。而如果通过了测试,我们还可以指定是否要用这个片元的深度值覆盖原有的深度值。
  6. 混合:对于不透明物体,开发者可以关闭混合操作,这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区中的像素值。对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的。
    

Shader|GPU流水线

    

Shader|GPU流水线

    

Shader|GPU流水线



 
  • 屏幕图像:双重缓冲策略
  1. 后置缓冲区:场景的渲染是在幕后发生的,即在后置缓冲区中。
  2. 前置缓冲区:之前显示在屏幕上的图像。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值