shader学习笔记

2024-05-08  本文已影响0人  虫小白
1,渲染流水线

1,流水线


流水线.jpg

2,模板测试通常用于限制渲染的区域,也可用于渲染阴影、轮廓渲染等。
3,关闭混合操作后,通过测试的颜色会直接覆盖颜色缓冲区中的值,适用于不透明的物体。
4,批处理思想:将多个小的DrawCall合并成一个大的DrawCall

2,UnityShader基础

1,UnityShader 结构
基本结构

Shader "Shader名称"
{
  Properties
  {//属性
  }
  SubShader
  {//显卡A使用的子着色器
  }
  SubShader
  {//显卡B使用的子着色器
  }
  FallBack "VertexLit"
}

进一步

Shader "命名空间\Shader名称"
{
  Properties
  {
    //属性
    Name("display name",PropertyType) = DefaultValue
    //eg. _Color("Main Color",Color) = (1,1,1,1)
  }
  SubShader //显卡A使用的子着色器
  {
    [Tags{"标签1"="值1" "标签2"="值2"}] //可选
    //eg. Tags{"Queue"="Transparent" "RenderType" = "Opaque" }
    [RenderSetUp] //可选,状态同样可在Pass块中声明,如果在SubShader中声明,则适用于所有Pass
    //eg. Cull off
    Pass
     {
      [Pass名称] //可选
      [Tags] //可选
      [RenderSetUp] //可选,同上面RenderSetUp
      
      CGPROGRAM
      //编译指令,如:
      #pragma vertex funName1  //告诉Unity哪个函数(funName1)包含了顶点着色器的代码
      #pragma fragment funName2  //告诉Unity哪个函数(funName2)包含了片元着色器的代码
      
      //Cg代码
      
      ENDCG
     }
  }
  SubShader
  {//显卡B使用的子着色器
  }
  FallBack "VertexLit"
}

(1)Property类型


20200907104855415.png

(2)SubShader中的标签(Tags)


47f06600-e791-4154-bcee-dbf2d5f2f706.jpg

(3)渲染状态设置(RenderSetUp)


66de7ac8-994c-47e6-bc7f-1f47e6219add.jpg

(4)Pass中的标签


20200907155113146.png
2,Pass结构
    Pass
     {
      [Pass名称] //可选
      [Tags] //可选
      [RenderSetUp] //可选,同上面RenderSetUp
      
      CGPROGRAM
      //编译指令,如:
      #pragma vertex funName1  //告诉Unity哪个函数(funName1)包含了顶点着色器的代码
      #pragma fragment funName2  //告诉Unity哪个函数(funName2)包含了片元着色器的代码
      
      //Cg代码
      //定义结构体
      struct 结构体名称                          
      { 
        类型1 名称1:语义1
        类型2 名称2:语义2
        ...
      }   
      //eg.
      //struct a2v
      //{
      //  float4 vertex:POSITION
      //  float3 normal:NORMAL
      //  ...
      //}                                              

      // 通过语义POSITION告诉Unity将模型顶点坐标填充到v中,模型顶点数据来自于定义的结构体
      // 通过语义SV_POSITION告诉Unity该函数输出的是裁剪空间下的顶点坐标
      float4 funName1(float4 v:POSITION):SV_POSITION
      {
        return mul(UNITY_MATRIX_MVP,v);
      }      
      
      fixed4 funName2():SV_Target
      {
        return fixed4(1.0,1.0,1.0,1.0);
      }
      ENDCG
     }

(1)给Pass起名后可在其他Shader中通过UsePass "Pass名称"命令引用该Pass,但Pass名称需大写,如UsePase "MyShader\PASSNAME"
(2)Unity支持的语义:
从应用阶段传递到顶点着色器:
POSITION、TANGENT、NARMAL、COLOR、TEXCOORDn
从顶点着色器传递到片元着色器:
SV_POSITION、COLOR0、COLOR1、TEXTURE0~TEXTURE7
输出语义:
SV_Target

3,属性
(1)属性并不是必须在Properties中声明才可使用的,在CG代码中定义后即可使用
(2)在Properties中声明属性只是为了将其在材质面板中可视化
(3)在CG中定义属性时,名称和类型需与在Properties中声明的保持一致,如声明并使用一个名称为“_Color”的属性(Properties中类型为Color对应CG中类型为fixed4):

Shader "MyShader"
{
  Properties
  {
     _Color("颜色",Color)=(1,1,1,1)
  }
  SubShader
  {
    Pass
    {
      CGPROGRAM
      fixed4 _Color;
      ......
      ENDCG
    }
  }
}
变量类型
3,标准光照模型

输出=自发光+环境光+高光反射+漫反射
(1)漫反射

上一篇 下一篇

猜你喜欢

热点阅读