Unity shaderLab组成部分

392 阅读6分钟

(15条消息) 【Unity Shader入门】Shader编程基础:ShaderLab语法_承续缘-CSDN博客

shaderLab的优势

  • 根据平台选择 不同的图像编程接口
  • 载入模型
  • 设置着色器的输入
  • 顶点着色器
  • 片元着色器
  • 把渲染资源加载到GPU
  • 按设置渲染状态
  • 对渲染顺序进行排序 image.png

组成部分

  • Shader "Siki/01 myshader"
    • 这里指定shader的名字,不要求跟文件名保持一致
    • 这里的/代表路径的意思
  • Properties
    • 属性 可以调节的属性类型
    • 这个类似控件
  • SubShader
    • Name 可选
      • Name "MyPassName"
      • Use Pass "MyShader /MYPASSNAME"
      • 后面可以被其他程序引用
    • Tags 可选 image.png
    • RenderSetup 可选 image.png | 状态名称 | 设置指令 | 解释| |---|---|---| | cull | cull Back/Front/Off | 设置剔除模式,剔除背面/正面/关闭剔除| | ZTest | ZTest Less Greater I LEqual I GEqual I Equal I NotEqual I Always | 设置深度测试时使用的函数| |ZWrite| ZWrite On / off | 开启/关闭深度写入| | Blend | Blend Srcfactor Dstfactor | 开启并设置混合模式 |
    • SubShader可以写很多个 属性块只有一个
      • SubShader里面的Pass可以写多个 如果Pass的数目过多, 往往会造成渲染性能的下降
    • 显卡运行效果的时候,从第一个SubShader开始,如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader,
    • 如果显卡这个SubShader里面某些效果它实现不了,它会自动去运行下一个SubShader
  • Fallback "VertexLit"
    • 如果subshader都不能进行 就运行fallback已经存在的shader
Shader "Siki/01 myshader"{
	Properties{
        }
        SubShader{
            Pass{
            }
        }
        Fallback "VertexLit"
}

Properties

  • _Color("Color",Color)=(1,1,1,1)
    • 变量名(控件名,类型)
  • 这里包含所有属性
  • texture后面的花括号是为了指定纹理属性{}
  • 内置的纹理名称:"white","black","gray","bump"
Properties{
        //floatx
        _Color("Color",Color)=(1,1,1,1) //float4
        _Vector("Vector",Vector)=(1,2,3,4) //float4
        //number
        _Int("Int",Int)= 34234 //float
        _Float("Float",Float) = 4.5 //float
        _Range("Range",Range(1,11))=6 //float
        //texture
        _2D("Texture",2D) = "red"{} //sampler2D
        _Cube("Cube",Cube) = "white"{} //samplerCube
        _3D("Texure",3D) = "black"{} //sampler3D
}
  • 可以设置的抬头
    • [HideInInspect]
      • 用途:在面板上隐藏该参数;
      • 可用于:任何参数;
      • 例:[HideInInspect] _FakeLightDir (“伪光方向”, vector) = (0.0, 1.0, 0.0, 1.0)
    • [NoScaleOffset]
      • 用途:禁用纹理的TilingOffset面板;不需要做TilingOffset的纹理,比如大部分的角色纹理,防止美术误设置;
      • 可用于:纹理参数;
      • 例:[NoScaleOffset] _MainTex (“主贴图”, 2d) = “white” {}
    • [Normal]
      • 用途:标示该纹理参数为法线贴图,以激活相关自检功能;
      • 可用于:2D纹理参数;
      • 例:[Normal] _NormTex (“法线贴图”, 2d) = “bump”{}
    • [HDR]
      • 用途:用于设置高动态范围颜色值;如:灯光颜色,自发光颜色等;
      • 可用于:颜色参数;
      • 例:[HDR] _EmitCol (“自发光颜色”, color) = (1.0, 1.0, 1.0, 1.0)
    • [Gamma]
      • 用途:用于颜色参数的色彩空间的转换;一般用于色彩空间为Linear的项目;
      • 用于:颜色参数;
      • 例:[Gamma] _EmitCol (“自发光颜色”, color) = (1.0, 1.0, 1.0, 1.0)
    • [PowerSlider(value)]
      • 途:对范围参数做Power处理后再传入Shader;纠正部分参数调节手感;
      • 可用于:范围参数;
      • 例:[PowerSlider(0.5)] _SpecPow (“高光次幂”, range(1, 90)) = 30
    • [Header(Label)]
      • 用途:标签,用于排版;
      • 可用于:单独使用;
      • 例:[Header(Texture)]
    • [Space(value)]
      • 用途:空行,用于排版;
      • 可用于:单独使用;
      • 例:[Space(50)]

SubShader

  • float half fixed 精度不一样
  • 贴图有 sampler2D samplerCube sampler3D
//在这里编写shader代码  HLSLPROGRAM
CGPROGRAM
        //使用CG语言编写shader代码
        float4 _Color; //float half fixed
        //fixed4
        float3 t1;// half3 fixed3
        float2 t;//half2 fixed2
        float t2;
        float4 _Vector;
        float _Int;
        float _Float;
        float _Range; 
        //贴图
        sampler2D _2D;
        samplerCube _Cube;
        sampler3D _3D;
        //节约内存
        //float  32位来存储
        //half  16  -6万 ~ +6万
        //fixed 11 -2 到 +2 在颜色上用
ENDCG
  • 数据类型
    • fixed: 11位定点数,-2.0~2.0,精度1/256;
    • half: 16位浮点数,-60000~60000,精度约3位小数;
    • float: 32位浮点数,-3.4E38~3.4E38,精度约6,7位小数;
    • Int: 32位整形数,较少使用;
    • bool: 布尔型数,较少使用;
    • 矩阵:
    • float2x2, float3x3, float4x4, float2x3 诸如此类格式;
    • half2x2, half3x3, half4x4, half2x3 诸如此类格式;
    • 纹理对象:
    • sampler2D: 2D纹理
    • sampler3D: 3D纹理
    • samplerCUBE: Cube纹
  • 使用原则
    • 原则上优先使用精度最低的数据类型;
    • 经验:
      • 世界空间位置和UV坐标,使用float;
      • 向量,HDR颜色,使用half;视情况升到float;
      • LDR颜色,简单乘子,可使用fixed;
    • 但是:
      • 不同平台对数据类型的支持情况不同;一般会自动转换,极少数情况自动转换会带来问题;
      • 部分平台上,数据类型精度转换消耗也不小;所以fixed也是慎用;
      • 多和你们的图形开发商量
  • 使用场景
    • POSITION 顶点位置 float3 float4
    • TEXCOORD0 UV通道1 float2 float3 float4
    • TEXCOORD1 UV通道2 float2 float3 float4
    • TEXCOORD2 UV通道3 float2 float3 float4
    • TEXCOORD3 UV通道4 float2 float3 float4
    • NORMAL 法线方向 float3
    • TANGENT 切线方向 float4
    • COLOR 顶点色 float4
    • pos 顶点位置CS float4
    • uv0 一般纹理UV float2
    • uv1 LighmapUV float2
    • posWS 顶点位置WS float3
    • nDirWS 法线方向WS half3
    • tDirWS 切线方向WS half3
    • bDirWS 副切线方向WS half3
    • color 顶点色 fixed4
struct VertexInput {
    float4 vertex   : POSITION;     // 顶点信息
    float2 uv0      : TEXCOORD0;    // uv信息
    float2 uv1      : TEXCOORD1;    // 第二套UV
    float3 normal   : NORMAL;       // 法线信息
    float4 tangent  : TANGENT;      // 切线信息
};
// 输出结构
struct VertexOutput {
    float4 pos : SV_POSITION;       // 屏幕顶点位置
    float2 uv0 : TEXCOORD0;         // uv信息
    float4 posWS : TEXCOORD1;       // 世界顶点位置
    float3 nDirWS : TEXCOORD2;      // 世界法线方向
    float3 tDirWS : TEXCOORD3;      // 世界切线方向
    float3 bDirWS : TEXCOORD4;      // 世界副切线方向
};

原文

//这里指定shader的名字,不要求跟文件名保持一致 
//这里的/代表路径的意思
Shader "Siki/01 myshader"{
	//属性 可以调节的属性类型
	//_命名习惯
	//这个类似控件
	Properties{
		_Color("Color",Color)=(1,1,1,1) //float4
		_Vector("Vector",Vector)=(1,2,3,4) //float4
		_Int("Int",Int)= 34234 //float
		_Float("Float",Float) = 4.5 //float
		_Range("Range",Range(1,11))=6 //float
		_2D("Texture",2D) = "red"{} //sampler2D
		_Cube("Cube",Cube) = "white"{} //samplerCube
		_3D("Texure",3D) = "black"{} //sampler3D
	}
	//SubShader可以写很多个 属性块只有一个 
	//显卡运行效果的时候,从第一个SubShader开始,如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader,
	//如果显卡这个SubShader里面某些效果它实现不了,它会自动去运行下一个SubShader
	SubShader{
		//至少有一个Pass
		Pass{

			//在这里编写shader代码  HLSLPROGRAM
			CGPROGRAM
				//使用CG语言编写shader代码
				float4 _Color; //float half fixed
				//fixed4
				float3 t1;// half3 fixed3
				float2 t;//half2 fixed2
				float t2;
				float4 _Vector;
				float _Int;
				float _Float;
				float _Range; 
				sampler2D _2D;
				samplerCube _Cube;
				sampler3D _3D;
				//节约内存
				//float  32位来存储
				//half  16  -6万 ~ +6万
				//fixed 11 -2 到 +2 在颜色上用
			ENDCG
		}
	}
	//如果subshader都不能进行 就运行fallback已经存在的shader
	Fallback "VertexLit"
}

顶点/片元着色器

Shader "Custom/Simple VertexFragment Shader" { 
    SubShader { 
    Pass { 
        CGPROGR
            #pragma vertex vert 
            #pragma fragment frag 
            float4 vert(float4 v : POSITION) : SV POSITION { 
                return mul (UNITY MATRIX MVP, v); 
            }
            fixed4 frag () : SV _ Target { 
                return fixed4 (1. 0, 0 . 0, 0 . 0, 1 . 0); 
            }
        ENDCG
    }
}