URP shader简要

244 阅读3分钟

变量类型

  • 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) //把法线转换到世界空间之中

加粗的部分是一般常用的变换。

URP 常用功能函数 - 简书 (jianshu.com)

后面还有一些光照和阴影等相关的函数后面进行添加。

常用的宏函数

纹理相关

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采样

还有一些其他后面添加