变量类型
- half:16位中精度浮点数,对应property中的Range、Float类型。
- float:32位的高精度浮点数,对应property中的Range,float类型。
- interger:32位整型,对应property中的int类型
- sampler2D:2D的纹理,对应property中的2D类型
- sampler3D:3D纹理,对应property找那个的3D类型
- samplerCUBE:cube类型,对应cube类
额外补充:
- [NoScaleOffset]:可以添加到2D上,可以隐藏贴图的Tiling和Offset选项
- [HideInInspector]:适用于任何property,使材质属性从检视版上消失
- [Normal]:可添加至2D property上,可以检测是否法线贴图
- [HDR]:可添加至2D或Color property之前,开始HDR效果,使数值突破1的限制
Tags
这里只给出一些常用的tags: 在subshader中的tags一般有:
- "RenderPipeline"="UniversalRenderPipeline" //指定渲染管线
- "RenderType"="Opaque" //指定渲染的方式(不透明的)
- "RenderType"="Transparent" //透明的
- "Queue"="Transparent" //渲染队列
在pass阶段中的tags:
- "LightMode"="UniversalForward" //前向渲染模式
语义
一般主要是a2v和v2f中的语言,再加上一个最后输出颜色的语义。
首先的a2v结构体,在这个结构体中,只有COLOR是自己控制的,其余都都是unity自动的根据语义输入信息:
- POSITION:模型文件中的位置信息
- NORMAL:模型文件中的法线的信息
- TANGENT:模型文件的切线的信息
- TEXCOORDn:模型文件的纹理坐标信息,n(0,7)
- COLOR:颜色的信息(自己定义的,不来自于文件)
然后是v2f结构体中,在这个结构体只有SV_POSITION语义强相关,其余语义没有太大意义,只是语义
- SV_POSITION:告诉unity该变量中包含了顶点在剪裁空间的位置信息
- COLOR0:告诉unity输出的第一组顶点颜色
- TEXCOORDn:输出纹理坐标,n在0~7之间
最忌计算出颜色在输出的时候也需要一个特定的语义:SV_TARGET
常用的函数
SpaceTransforms.hlsl
- TransformObjectToWorld(float3 positionOS) //模型空间转换到世界空间,M变换
- TransformWorldToObject(float3 positionWS) //世界空间转换到模型空间,反M变换
- TransformWorldToView(float3 positionWS) //世界空间到相机空间,先M变换再V变换
- TransformObjectToHClip(float3 positionOS) //模型空间到剪裁空间,MVP变换
- TransformWorldToHClip(float3 positionWS) //世界空间到剪裁空间,VP变换
- TransformWViewToHClip(float3 positionVS) //相机空间到剪裁空间,p变换
- TransformObjectToWorldDir(real3 dirOS) //方向矢量转换到世界空间中
- TransformWorldToObjectDir(real3 dirWS) //世界空间到模型空间
- TransformWorldToViewDir(real3 dirWS)
- TransformWorldToHClipDir(real3 directionWS)
- TransformObjectToWorldNormal(float3 normalOS) //把法线转换到世界空间之中
加粗的部分是一般常用的变换。
后面还有一些光照和阴影等相关的函数后面进行添加。
常用的宏函数
纹理相关
TEXTURE2D(_MainTex); //采样函数
SAMPLER(sampler_MainTex); //采样器函数
o.texcoord.xy = TRANSFORM_TEX(i.texcoord,_MainTex); //更新纹理坐标,肯呢个进行了缩放,偏移等操作
half4 tex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.texcoord.xy) //拿出纹理中的颜色值
half4 tex = tex2D(_MainTex,float2(dott,0.5))*_BaseColor; //也可以使用tex2D采样
还有一些其他后面添加