Shader学习(二)

来源:互联网 发布:2016做淘宝还赚钱吗 编辑:程序博客网 时间:2024/06/03 21:56

unity 中绘制屏幕要将每个物体从自己所属的物体空间依次经过世界空间,摄像机空间,裁剪空间,标准设备空间进行变换,最终到达实际窗口空间。整个渲染过程分为应用阶段、几何阶段、光栅化阶段:
应用阶段 输出 渲染图元 给 几何阶段
几何阶段 输出 屏幕空间的顶点信息 给 光栅化阶段
1. 应用阶段
通常由cpu负责实现,
把数据加载到显存
设置好每个模型的渲染状态,
调用DrawCall

DrawCall是一个命令,发起方是CPU, 接收方是GPU, 从cpu到gpu的一个过程就一个drawcall
这个命令仅仅指向一个需要被渲染的图元(primitives)列表,而不会再包含任何材质信息。收到Drawcall命令后,GPU会根据渲染状态(如材质、纹理、着色器等)和所有输入的顶点数据来进行计算,最终输入到屏幕上的像素。

  1. 几何阶段
    通常由GPU负责实现。
    负责和每个渲染元打交道,进行逐定点,逐多边形的操作。
    把顶点坐标变换到屏幕空间中,再交给光栅器处理。输出屏幕空间的二维定点坐标,每个定点对应的深度值 着色等相关信息
  2. 光栅化阶段
    使用上个阶段传递的数据来产生屏幕上的像素。并渲染最终的图像。
    在GPU上运行
    需要对上一个阶段得到的逐定点数据进行插值,然后再进行逐像素处理

几何阶段和光栅化阶段流程

顶点着色器:实现顶点空间的变换,逐顶点光照、输出后续阶段所需数据等功能。不可以创建、销毁顶点,无法得到顶点之间的关系,各个顶点相互独立,(每个顶点会调用一次顶点着色器)

曲面细分着色器:细分图元。

几何着色器:执行逐图元的着色操作,或被用于产生更多的图元。

裁剪:完全在摄像机视野的传递下阶段,完全不在摄像机视野的移除,部分在摄像机视野的进行裁剪。(裁剪过程是硬件上的固定操作,不可以编程控制该过程,但可以配置裁剪方式)

屏幕映射:把图元坐标转换到屏幕坐标系中。

三角形设置:计算光栅化一个三角形网格所需的信息。获得整个三角网格像素的覆盖情况,计算每条边上的像素坐标。 为了能够计算边界像素的坐标信息,需要三角形边界的表示方式。这个过程就叫三角形设置。
三角形遍历:会检查每个像素是否被一个三角网格所覆盖,如果覆盖,就会生成一个片元(Fragment)。这样一个找到那些像素被三角形所覆盖的过程就是三角形遍历。这个过程输出一个片元序列。一个片元并不是真正意义上的像素,而是包含了很多状态的几何。这些状态(屏幕坐标、深度信息、以及几何阶段输出的顶点信息、如法线、纹理坐标等)用于计算每个像素的最终颜色。

片元着色器:实现逐片元的着色操作。(一个像素可以包含多个片元,一个片元可以覆盖多个像素)
片元是对三个顶点的信息进行插值得到的。片元着色器在directx被称为像素着色器。 片元着色器的输入是上一个阶段对顶点信息插值得到的结果。其中最重要的就是纹理采集。
逐片元操作
在directx中,成为输出合并阶段。
逐片元操作阶段负责一些重要操作,如修改颜色、深度缓冲、进行混合等

逐片元操作阶段图

模板测试:
GPU会首先读取模板缓冲区中该片元位置的模板值,然后将该值和读取(使用读取掩码)的参考值进行比较,如果片元没有通过测试,该片元就会被舍弃。
深度测试
GPU把该片元和已经存在于深度缓存区中的深度值进行比较。
双重缓冲
对场景的渲染是在后置缓冲,一旦场景已经渲染到了后置缓冲中,gpu就会交换后置缓冲区和前置缓冲区
混合是指是否将新的像素点直接覆盖旧的像素点,导致透明像素也会覆盖下方的像素

最后说下shader和material的关系
shader负责将输入的mesh以指定的方式和输入的贴图或颜色等组合作用,然后输出。绘图单元可以根据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的shader,以及对shader的特定的参数设置,将这些内容打包存储到一起,就得到material。将material赋予合适的renderer来进行渲染输出
在cgprogram…endcg这样一个代码块中,同样是一段cg程序,要访问在properties中所定义的变量,必须使用和之前变量相同的名字进行申明。
再次声明sampler2D _mainTex就是再次声明并连接了_MainTex使得接下来的cg程序能够使用这个变量。

阅读全文
0 0
原创粉丝点击