Unity Shader(1)

2024-07-03  本文已影响0人  叫我颜先生

GPU流水线

  1. CPU将数据(纹理、网格等)从硬盘加载到内存,然后再从内存加载到显存,因为显卡对于显存的访问速度更快,而且大多数显卡对于内存没有直接的访问权限
  2. 准备好之后,CPU调用DrawCall渲染命令开始进行GPU流水线渲染


    image.png
  3. 几何阶段:
    • 顶点着色器:完全可编程,顶点空间变换、着色、逐顶点光照
    • 曲面细分着色器:可选着色器,细分图元
    • 几何着色器:可选着色器,逐图元着色
    • 裁剪:可配置,自定义裁剪区域、控制裁剪正面还是背面等,不在摄像机视野范围内不需要处理
    • 屏幕映射:不可,把图元坐标转换到屏幕坐标系,对于OpenGL和DirectX对应的坐标系就不相同了
  4. 光栅化阶段:
    • 三角形设置:绘制出三角形三条边
    • 三角形遍历:三角形图形
    • 片元着色器:完全可编程,逐片元着色
    • 逐片元操作:可配置,修改颜色,深度缓冲,混合等

Unity Shader

语法

  1. Properties

    类型 语法 例子
    Int n _Int(“Int”,Int)=2
    Float n _Float(“Float”,Float)=1.5
    Range(min,max) n _Range(“Range”,Range(0.0,5.5))=3.0
    Color (n,n,n,n) _Color(“Color”,Color)=(1,1,1,1)
    Vector (n,n,n,n) _Vector(“Vector”,Vector)=(2,3,4,5)
    2D “defaulttexture”{} _2D(“2D”,2D)=“”{}
    Cube “defaulttexture”{} _Cube(“Cube”,Cube)=“white”{}
    3D “defaulttexture”{} _3D(“3D”,3D)=“black”{}
  2. SubShader

    • 每个UnityShader可包含多个SubShader语义块,不支持就Fallback。

    • 每个Pass都是一次完整的渲染流程,但是过多的Pass会造成渲染性能下降

    • 状态和标签同样可以在Pass中设置,但是SubShader中一些标签设置是特定的,和在Pass中使用不一样,SubShader的设置会作用于所有Pass

    SubShader{
        [Tags]
        
        [RenderSetup]
        
        Pass{
        }
        //other Passes
    }
    
    1. 状态设置:

      状态指令可以设置显卡的各种状态,例如是否开启混合,深度测试等

上一篇 下一篇

猜你喜欢

热点阅读