UnityShader开发之常见语义与标签

1.模板

Shader  “ShaderName”{

        Properties{

        }

        SubShader{

        }

        Fallback “VertexLit”

}

 

2.Properties语句块

属性类型默认值的定义语法例子
Intnumber_Int("Int",Int)=2
Floatnumber_Float("Float",Float)=1.5
Range(min,max)number_Range("Range",Range(0.0,5.0))=3.0
Color(number,number,number,number)_Color("Color",Color)=(1,1,1,1)
Vector(number,number,number,number)_Vector("Vector",Vector)=(2,3,6,1)
2D"defaultTexture" {}_2D("2D",2D)="" {}
Cube"defaultTexture" {}_Cube("Cube",Cube)="white" {}
3D"defaultTexture" {}_3D("3D",3D)="black" {}

 

3.SubShader 语义块

子着色器

SubShader{

        [Tag]

        [RenderSetup]

        Pass{

        }

}

状态名称设置指令解释
CullCull Back |Front|Off是指剔除模式,剔除背面/正面/关闭剔除
ZTestZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always设置深度测试时使用的函数
ZWriteZWrite On|Off开启/关闭深度写入
BlendBlend SrcFactor DstFactor开启并设置混合模式

        在SubShader上设置时,会应用到所有Pass

        SubShader的标签类型

标签类型说明例子
Queue控制渲染顺序,指定该物体属于哪一个渲染队列,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染,我们也可以自定义使用的渲染队列来控制物体的渲染顺序Tas{“Queue”=“Transparent”}
RenderType对着色器进行分类,例如这是一个不透明的着色器或是一个透明的着色器等,这可以被用于着色器替换功能。Tags{“RenderType”=“Opaque”}
DisableBatching一些SubShader在使用Unity的批处理功能时会出现问题,例如使用了模型空间下的坐标进行顶点动画。这时可以通过该标签来直接指明是否该SubShader使用批处理Tags{“DisableBatching”=“True”}
ForceNoShadowCasting控制使用该SubShader的物体是否会投射阴影Tags{“ForceNoShadowCasting”=“true”}
IgnoreProjector如果该标签为“true”,那么使用该SubShader的物体将不会受Projector的影响,通常用于半透明物体Tags{“IgnoreProjector”=“true”}
CanUseSpriteAtlas当该SubShader是用于精灵(Sprite)时,该标签设为“False”Tags{“CanUseSpriteAtlas”=“False”}
PreviewType指明材质面板将如何预览该材质,默认情况下,材质将显示为一个球形,我们可以通过将该标签的值设为“Plane”“SkyBox”来改变预览类型Tags{“PreviewType”=“Plane”}

 

        Level of Detail (LOD),用来定义不同的性能的显卡所对应的子着色器

 

4.Pass语义块

Pass{

        [Name]

        [Tags]

        [RenderSetup]

        //Other code

}

 

标签类型说明例子
LightMode定义该Pass在Unity的渲染流水线中的角色Tags{“LightMode”=“ForwardBase”}
RequireOptions用于指定当满足某些条件时才渲染该Pass,它的值是一个由空格分隔的字符串。目前,Unity支持的选项有:SoftVegetationTags{“RequireOptions”=“SoftVegetation”}

5.头文件

文件名描述
UnityCG.cginc包含了最常使用的帮助函数、宏和结构体等
UnityShaderVariables.cginc在编译UnityShader时,会被自动包进来,包含了许多内置的全局变量,例如UNITY_MATRIX_MVP
Lighting.cginc包含了各种内置的光照模型,如果编写的是SurfaceShader会自动打包进来
HLSLSurport.cginc在编译UnityShader时,会被自动包含进来,声明了许多的用于跨平台编译的宏和定义

 

UnityCG.cginc中常用的结构体

名称描述包含的变量
appdata_base可用于顶点着色器的输入顶点位置、顶点法线、第一组纹理坐标
appdata_tan可用于顶点着色器的输入顶点位置、顶点切线、顶点法线、第一组纹理坐标
appdata_full可用于顶点着色器的输入顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标
appdata_img可用于顶点着色器的输入顶点位置、第一组纹理坐标
v2f_img可用于顶点着色器的输出裁剪空间中的位置、纹理坐标

 UnityCG.cginc中常用的帮助函数

函数名描述
float3 WorldSpaceViewDir(float4 v)输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v)输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
float3 WorldSpaceLightDir(float4 v)仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化
float3 ObjSpaceLightDir(float4 v)仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化
float3 UnityObjectToWorldNormal(float3 norm)把法线方向从模型空间转换到世界空间中
float3 UnityObjectToWorldDir(in float3 dir)把方向矢量从模型空间变换到世界空间中
float3 WorldToUnityObjectDir(in float3 dir)把方向矢量从世界空间变换到模型空间中

 

6.Unity提供的CG/HLSL语义

从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义

语义描述
POSTITION模型空间中的顶点位置,通常是float4类型
NORMAL顶点法线,通常是float3类型
TANGENT顶点切线,通常是float4类型
TEXCOORDn,如 TEXCOORD0、TEXCOORD1该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,依次类推。通常是float2或float4类型
COLOR顶点颜色,通常是fixed4或float4类型

 

从顶点着色器传递数据给片元着色器时Unity使用的常用语义

语义描述
SV_POSITION裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量,等同于DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0通常用于输出第一组顶点颜色,但不是必须的
COLOR1通常用于输出第二组顶点颜色,但不是必须的
TEXCOORD0~TEXCOORD7通常用于输出纹理坐标,但不是必需的

 

片元着色器输出时Unity支持的常用语义

语义描述
SV_Target输出值将会存储到渲染目标中,等同于DirectX9中的COLOR语义,但最好使用SV_Target

 

7.数据精度

类型精度
float最高精度的浮点值。通常使用32位来存储
half中等精度的浮点值。通常使用16位来存储,精度范围是-60000~+60000
fixed最低精度的浮点值。通常使用11位来存储,精度范围是-2.0~+2.0

5.

CGPROGRAM 开始CG代码

ENDCG 结束CG代码

#pragma 标注东西 例如片段着色器使用哪个方法、使用的是哪个着色模型版本

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Shader语义是一种用于定义着色器代码中变量的标识符。它们可以提供有关变量的更多信息,例如变量的作用、数据类型和使用方式。使用着色器语义可以使着色器代码更加简洁、易于阅读,并增加可维护性和可扩展性。 在Unity中,着色器语义通常用于顶点着色器和片段着色器中。在顶点着色器中,通过使用语义变量,可以将模型空间下的顶点位置转换为裁剪空间下的位置,并对其他语义变量进行计算和赋值。 在代码中,UnityObjectToClipPos函数被用来进行模型空间到裁剪空间的转换。这个函数是Unity内置的函数,它将模型空间下的坐标转换为裁剪空间下的坐标。具体实现方式可能会因Unity版本和平台而有所不同,但使用方法是一致的。 除了顶点着色器,语义还可以在片段着色器中使用。比如,在一个完整的代码案例中,我们可以使用纹理坐标和法线语义来对表面进行着色。在表面着色器函数中,我们可以将纹理坐标和主纹理的颜色值赋值给表面输出结构体,还可以将法线向量从世界空间变换到切线空间,并对其他表面输出结构体的变量进行计算和赋值。 总之,Unity Shader语义为我们提供了一种方式来定义和使用着色器代码中的变量,使其更具可读性和可维护性,并且能够方便地与其他着色器和渲染管线进行交互,同时也可以更方便地与外部程序进行交互。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值