《Unity Shader入门精要》笔记

 

《Unity Shader入门精要》笔记

渲染流水线

  • 应用阶段(CPU)
  • 把数据加载到显存
  • 设置渲染状态:指定Shader、光源、材质等
  • DrawCall:发送一次渲染到GPU
  • 几何阶段(GPU)
  • 顶点数据->顶点着色器->曲面细分着色器(可选)->几何着色器(可选)->裁剪(可配置)->屏幕映射
  • 光栅化阶段(GPU)
  • 三角形设置->三角形遍历->片元着色器(可选)->逐片元操作(可配置)
  • Shader:可编程阶段对应的一段程序,Unity ShaderLab 是一个整合体,不仅包括 Shader 代码

Unity Shader

  • 模板:
    Standard Surface Shader-标准光照模型
    Unlit Shader-不包含光照的基本着色器
    Image Effect Shader-后处理效果模板
    Compute Shader-使用Shader计算

  • Unity ShaderLab
     Shader "ShaderName"{
     Properties{
         //Sample
         //VarName ("display name",PropertyType) = DefaultValue
    
         //Numbers
         Blood ("Player's Blood",Int) = 100
         Speed ("Player's Speed",Float) = 3.2
         Level ("Player's Level",Range(0.0,100.0)) = 50.0
    
         //Colors and Vectors
         Painter ("Player's Color",Color) = (1,1,1,1)
         Distance ("Player's Distance",Vector) = (1,3,1,0)
    
         //Textures
         Clothes ("Player's clothes",2D) = ""{}
         _Cube ("A Cube Texture",Cube)= "white"{}
         _3D ("A 3D",3D) = "black"{}
     }
     SubShader{
       [Tags] //作用于所有Pass
       [RenderSetup] //作用于所有Pass
    
       Pass{
         [Name]
         [Tags] //作用于本Pass
         [RenderSetup]  //作用于本Pass
       }
    
       UsePass "" //引用其他Shader中的pass
       GrabPass //截屏
    
     }
    
     SubShader{}
    
     Fallback "Diffuse" //以上SubShader都不执行时候的备胎方案(或 Fallback Off)
     }
    
  • Tags { “TagName1”=”Value1” “TagName2”=”Value2”}
  • SubShader 的标签:
    • Queue 渲染队列
    • RenderType 着色器分类
    • DisableBatching 禁用批处理
    • ForceNoShadowCasting 是否投射阴影
    • IgnoreProjector 不受Projector影响,通常用于半透明物体
    • CanUseSpriteAtlas 用于Sprite时需要设成False
    • PreviewType 材质面板预览设置,默认是个球
  • Pass 的标签:
  • LightMode 定义该Pass在渲染流水线中的角色
  • RequireOptions 该Pass的前提条件,不满足则不执行

  • RenderSetup Cull Back/Front/off
    ZTest Less/Greater/LEqual/GEqual/Equal/NotEqual/Always
    ZWrite On/Off
    Blend SrcFactor DstFactor

三种着色器

  • 表面着色器 Surface Shader:封装了光照细节的顶点/片元着色器,定义在SubShader层级
    Shader ""{
      SubShader{
        Tags {}
    
         CGPROGRAM
         #pragma surface suf Lambert
         //在这里写Cg/HLSL代码
         //...
         ENDCG
      }     
    }
    
  • 顶点/片元着色器:功能最强大,写在Pass层级
    Shader ""{
    SubShader{
      Pass{
    
       CGPROGRAM
       #pragma vertex vert
       #pragma fragmet frag
       ENDCG
     }
    }     
    }
    
  • 固定函数着色器:已过时,不需要