Unity Shader常用的数值类型和语义

[Unity Shader] 常用的数值类型和语义
1 ShaderLab属性类型和Cg变量类型的匹配关系

Color、Vector:float4,half4,fixed4

Range、Float:float, half, fixed

2D:sampler2D

3D:sampler3D

Cube:samplerCube

注意:这些属性类型是在定义属性时使用,例如:

复制代码
1 Shader “Unlit/Test Shader”
2 {
3 Properties
4 {
5 _Color (“Color Tint”, Color) = (1, 1, 1, 1)
6 _MainTex (“Main Tex”, 2D) = “white” {}
7 _BumpMap (“Normal Map”, 2D) = “bump” {}
8 _BumpScale (“Bump Scale”, Float) = 1.0
9 _SpecularMask (“Specular Mask”, 2D) = “white” {}
10 _SpecularScale (“Specular Scale”, Float) = 1.0
11 _Specular (“Specular”, Color) = (1, 1, 1, 1)
12 _Gloss (“Gloss”, Range (8.0, 256.0)) = 20.0
13 }
14 SubShader{
15 Pass{
16 …
17 }
18 }
复制代码

2 Cg/HLSL常用的3种精度的数值类型

float: 32位存储,用在坐标、未归一化的矢量、uv、一些调整参数

half:16位存储,范围 -60000~60000

fixed:11位存储,范围-2.0~2.0,用于存储颜色、归一化后的矢量、在这个范围内的参数等

注意:uv不能用fixed存储,因为可能通过贴图的Tiling和Offset让其范围超过[0, 1]

复制代码
1 fixed4 _Color;
2 sampler2D _MainTex;
3 float4 _MainTex_ST;
4 sampler2D _BumpMap;
5 float _BumpScale;
6 sampler2D _SpecularMask;
7 float _SpecularScale;
8 fixed4 _Specular;
9 float _Gloss;
10
11 struct a2v
12 {
13 float4 vertex : POSITION;
14 float3 normal : NORMAL;
15 float4 tangent : TANGENT;
16 float4 texcoord : TEXCOORD0;
17 };
18
19 struct v2f
20 {
21 float4 pos : SV_POSITION;
22 float2 uv : TEXCOORD0;
23 float3 lightDir : TEXCOORD1;
24 float3 viewDir : TEXCOORD2;
25 };
26
27 v2f vert (a2v v)
28 {
29 v2f o;
30 …
31 return o;
32 }
33
34 fixed4 frag (v2f i) : SV_Target
35 {
36 …
37 return fixed4(ambient + diffuse + specular, 1.0);
38 }
复制代码

3 Unity Shader常用语义(寄存器)

就是上面这段代码中的标红部分。它代表了前面那个变量从哪里获得数据或者存储到哪里。

3.1 从应用阶段传递模型数据给顶点着色器时:

POSITION:模型空间中的顶点位置,通常是float4类型

NORMAL:顶点法线,通常是float3类型

TANGENT:顶点切线,通常是float4类型,第四个分量用于存储特殊数值

TEXCOORDn:顶点纹理坐标,通常是float2或float4类型。在Unity Model2和3中,n=8(Unity默认),在4和5中n=16.

COLOR:顶点颜色,通常是fixed4或float4类型

3.2 从顶点着色器传递给片元着色器时:

SV_POSITION:裁剪空间中的顶点坐标,结构体中必须包含一个用该语义的变量

COLOR0:输出第一组顶点颜色,不必需

COLOR1:输出第二组顶点颜色,不必需

TEXCOORD0~7:输出纹理坐标,不必需

3.3 片元着色器输出:

SV_Target: 输出值将会存储到渲染目标(render target)中

注意:一个语义可以使用的寄存器最多只能处理4个浮点值(float),因此对于4x4矩阵,需要拆分成4个float4类型的变量来存储矩阵数据

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值