(15条消息) 【Unity Shader入门】Shader编程基础:ShaderLab语法_承续缘-CSDN博客
shaderLab的优势
- 根据平台选择 不同的图像编程接口
- 载入模型
- 设置着色器的输入
- 顶点着色器
- 片元着色器
- 把渲染资源加载到GPU
- 按设置渲染状态
- 对渲染顺序进行排序
组成部分
- Shader "Siki/01 myshader"
- 这里指定shader的名字,不要求跟文件名保持一致
- 这里的/代表路径的意思
- Properties
- 属性 可以调节的属性类型
- 这个类似控件
- SubShader
- Name 可选
- Name "MyPassName"
- Use Pass "MyShader /MYPASSNAME"
- 后面可以被其他程序引用
- Tags 可选
- RenderSetup 可选
| 状态名称 | 设置指令 | 解释| |---|---|---| | 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
- Name 可选
- 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)]
- [HideInInspect]
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
}
}