【Unity Shader 个人笔记】 渲染管线

Unity ShaderLab中的三种shader

  • 固定函数着色器
  • 表面着色器
  • 顶点着色器/片段着色器

固定功能着色器
针对于早期不支持可编程渲染管线的gpu,在unity里面只能使用shaderlab语法进行编写。由于硬件更新速度快,这类型的gpu已经被淘汰了,而且unity自从5.2版本后也自动将这种类型的着色器自动转换成顶点和片元着色器,所以基本可以忽略
表面着色器
是unity在顶点和片元着色器上面的一层封装,用户不用在意具体实现细节,只需要给出渲染所需的参数。编写时也是在CGPROGRAM和ENDCG之间使用CG/HLSL/GLSL等语法编写并嵌入到shaderlab语法中的着色器,但不用放在pass渲染流程块中。
顶点和片元着色器
在pass渲染流程块中,在CGPROGRAM和ENDCG之间使用CG/HLSL/GLSL等语法编写并嵌入到shaderlab语法中的着色器,用户可以定制具体的渲染效果。

  1. 模型是由三角面片组成,而每个三角面片又是又三个顶点组成,并且每个顶点又包含顶点坐标,法线方向,纹理坐标,切线方向,顶点颜色等数据信息。在unity
    shader中这些数据是由使用该shader所在材质的mesh render提供。
  2. 顶点着色器是逐个顶点的调用,它的输入实际上是模型顶点数据。
  3. 片元着色器是逐个片元的调用,它的输入实际上是顶点着色器的输出进行插值后得到的结果。

渲染流水线

在这里插入图片描述

应用阶段(Application Stage)

作用: 应用程序阶段,使用高级编程语言(C、C++、JAVA 等)进行开发,主要和CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件。

阶段目标: 准备渲染所需的几何信息,即渲染图元(rendering primitives)

Draw Call:

  • 本质: 图像编程接口
  • 原理: CPU通过调用DrawCall向命令缓冲区(Command Buffer)的队列中添加渲染命令,而GPU则从已有的队列中读取渲染命令去执行
  • 优化: 由于调用DrawCall即使得CPU准备大量渲染数据提交到缓冲队列,大量的DrawCall会使得CPU过载,因此尽量减少DrawCall的调用次数(如进行批处理,合并网格…)
几何阶段(Geometry Stage)
  • 接收数据: 应用阶段所准备好的渲染图元的信息,也就是顶点数据(模型自身坐标系、顶点颜色、纹理UV等)
    阶段目标: 决定所需绘制图元的信息(绘制方法,绘制坐标)
光栅化阶段(Rasterizer Stage)
  • 接收数据: 几何阶段准备好的顶点信息
  • 阶段目标: 对几何阶段传递过来的屏幕空间的顶点信息进行处理,最终生成屏幕像素,渲染出图像

Unity Shader渲染流程
  1. Start : 顶点(模型空间)
  2. 顶点着色器: 顶点转换 (模型空间—>裁剪空间)(自定义操作)
  3. 光栅化: 顶点裁剪(视锥体裁剪) 背面剔除(Cull) 图元装配
  4. 片段着色器: 片段着色 (自定义操作)
  5. 三大测试: 模板测试(Stencil Test)深度测试(Depth Test)透明测试(Alpha Test)混合模式(Blend Mode)
  6. 更新帧缓存中的颜色值 GBuffer ——> frontBuffer——> frameBuffer
  7. End: 显示
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值