shader基础

来源:互联网 发布:淘宝原创衣服品牌 编辑:程序博客网 时间:2024/03/29 14:14

shader

具体参考代码例子(源 入门精要)

渲染流水线

(概念性的阶段)

应用阶段,几何阶段,光栅化阶段

  • 应用阶段
    CUP 工作时间可控,工作职责:场景数据(模型,摄像机,光源等)、剔除工作、设置渲染状态(输出渲染所需的几何信息,渲染图元(点,线,三角形))。
  • 几何阶段
    GPU 工作 处理 我们要绘制的几何相关的事情
  • 光栅化阶段
    GPU 工作 根据几何阶段传递过来的数据产生屏幕像素,渲染出图像。

GPU 和 CPU 之间的通信

  • 流程
    该过程属于应用阶段:硬盘加载渲染数据到内存,然后网格纹理等数据会加载至显存中(GPU可以更快访问),设置渲染状态(设置该纹理使用什么shader ,材质等信息),上面都准备好了,CPU 调用Draw Call (指向一个渲染图元队列)告诉GPU 可以开始渲染了,GPU根据渲染状态进行渲染,最终形成可见的像素。

GPU流水线

这里写图片描述

绿色表示完全可编程,黄色可配置但不可编程,蓝色是固定的,没有控制权,实线必须由开发者实现,虚线可选

  • CPU 和 GPU如何并行工作的:
    CPU和GPU之间使用了一个命令缓冲区,该区域是一个存放命令的队列,而Draw Call 只是其中的一个命令,工作的时候GPU则去取命令而CPU则去放,这样实现了并行。
  • Draw Call 影响帧率:
    那是因为调用DrawCall的时候会进行很多数据的准备,比如状态,命令等,然后调用Draw Call 如果调用很频繁,则会影响帧率。
    补充:
  • u3d使用的是左手坐标系
    这里写图片描述
  • 世界空间
    世界空间相对于其他坐标空间来说是固定不变的。所以,它也被用作空间变换的参考系。我们把它的坐标系称为世界坐标系。
  • 模型空间:
    模型空间,也称为对象空间。如果把世界空间比作现实世界的话,那么模型就好比一座房子或者房子里的一个人等等。假设以人的重心为原点,正面向前的方向为 z-轴,头顶的方向为 y-轴,左侧方向为 x-轴来构建一个坐标系。我们可以用这个坐标系来描述这个人自身的模型空间。这个坐标系也称为模型坐标系(或对象坐标系)一般来说,我们都是基于世界坐标系来描述模型坐标系的。
  • NDC 归一化设备坐标系

Shader基础

Unity3d 提供了高级的渲染层,省去了繁琐的使用方式,通过ShaderLab说明性语言即可简单的实现shader

shader结构

第一行指定shader名字 eg:Shader "custom/MyShader"
Properties 语义块中包含了很多属性,并可以出现在检查面板中,作用仅仅是显示在检视面板中,真正定义变量是在CG代码中,这样脚本就可以与shader进行数据传递了。

  • Properties
    这里写图片描述
    常见的属性查阅
    这里写图片描述
    • SubShader
      这里写图片描述
      SubShader选择一个能在目标平台运行的SubShader
      Pass 定义了一次完整的渲染流程,如果过多会导致性能低,在SubShader里面可以定义Tags(标签)和渲染状态设置指令
    • 常见的渲染状态
      这里写图片描述
  • 标签
    Tags是一对键值对,都是字符串,告诉引擎应该这样以及何时渲染Tags {"TagName1" = "Value1"}
  • 常见的标签
    这里写图片描述
    该标签可以再SubShader中声明,但是不可以在Pass中使用
  • Pass语义块
    这里写图片描述
    定义pass名字

Name “MyPassName” 其他shader调用 UsePass “MyShader/MYPASSNAME” –自动转换

  • Fallback
    如果上面的SubShader都不合适则选择这个

Unity shader的形式

着色器代码在SubShader(表面着色器),Pass语义块(顶点/片元着色器)。

表面着色器

Unity 自己创造的着色器代码类型。底层是顶点/片元着色器,只是一层更高的抽象,定义在SubShader语义块内(非Pass)CGPROGRAM 和 ENDCG之间,无需关心底层的光照,纹理,和法线纹理怎么填充的。本质上来说unity shader 就两种形式:顶点/片元着色器和固定函数着色器

顶点/片元着色器

编写在Pass内,CGPROGRAM和ENDCG之间

固定函数着色器(Fixed Function Shader)

前面属于可编程管线,固定函数着色器属于低端机使用基本淘汰的位置

  • unity shader 就是ShaderLab文件(使用的是shanderlab语言,unity自己封装的)
  • 传统的只能编写特定的类型的shader eg 顶点/片元,对于unity shader 则顶点表面着色器可以同时包含
  • unity shader 高度封装使得对几何着色器等,支持相对较差

下节讲述shader数学基础

原创粉丝点击