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

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

Posted on  2017-08-11 17:39  珍蜗蜗 阅读( 1149) 评论( 0)   编辑  收藏

  书看到第八章,跟随写了一些例子,但有些数值类型的使用还是需要特别注意,经常需要查阅,在这里做一下总结。

 

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类型的变量来存储矩阵数据

 


你可能感兴趣的:(shader)