// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "GameNose" // 第一行定义了shader的名字 Shader "GameNose
{
SubShader{ //渲染层
Pass{ //渲染管道
CGPROGRAM //开始写表面着色器
#pragma vertex vert // 告诉U3D, vert这个函数包含了顶点着色器的代码
#pragma fragment frag // frag 包含了片元着色器的代码
{通用的编译指令:#progam(指令) }
float4 vert (float4 v :POSITION) : SV_POSITION{ // vert函数 v是顶点坐标参数 POSITION告诉u3d把模型的顶点坐标填充到v中,SV_POSITION 告诉的是顶点着色器的输出使裁剪空间中的顶点坐标
return UnityObjectToClipPos(v) ; //顶点函数返回
}
fixed4 frag(): SV_Target {
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG //表面着色器结束
}
}
}
注意: Properties 的语义不是必须的,也可以选择不声明
由CGPROGRAM 和 ENDCG 所包围的CG 代码片段:#pragma /p’ræɡmə/注释 vertex vert
#pragma fragment frag 告诉U3D哪个函数包含了顶点着色器的代码,哪个包含的是片元着色器的代码,其标准格式是: #pragma vertex/fragment 函数名
关于float4数据类型
GPU是以四维向量为基本单位来计算的。4个浮点数所组成的float4向量是GPU内置的最基本类型。使用GPU对两个float4向量进行计算,与CPU对两个整数或两个浮点数进行计算一样简单,都是只需要一个指令就可以完成。
HLSH的基本数据类型定义了float、int和bool等非向量类型,但是它们实际上都会被Complier转换成float4的向量,只要把float4向量的其中3个数值忽略,就可以把float4类型作为标量使用。
使用贴图坐标时,只需要二维向量,HLSL定义了float2类型作为二维向量使用。
Shader经常会用到矩阵,HLSL有一个内置类型float4x4,它可以用来表示一个44矩阵。float4x4并不是GPU的内置类型,float4x4实际上是由4个float4所组成的数组。其他的还有float3x3、float2x2,分表代表33矩阵、22矩阵。
Shader也可以声明数组,44矩阵实际上就是一个float4 m[4]的数组。注意,Shader中的所有的变量都使用寄存器,没有其他内存空间可以使用,所以越大的数组会占用越多的寄存器,甚至会超出寄存器的数量限制。
在使用float4向量中的个别数值时,可以用xyzw或rgba,都可以用来表示四维向量中的数值。但不能把它们混用,例如不能用xyba,把它视为颜色时就用rgba,否则就是用xyzw,不能把这二者混合使用。
1、Float Fixed
float : 常见的写法有 float4 和 float3
float3 : 一般情况下我们指的是向量,例如 :float3 normal :NORMAL
float4 : 对那些需要操作的顶点用 float4 来表示 ,例如 : float4 vertex : POSITION
那么我们为什么用 float4 来表示我们想要的顶点呢?
在unity内部,通过矩阵的方式来描述这些点,一般情况下我们觉得 3*3的矩阵就能够描述一个点了,但是这样的点是没有办法进行变换的 : 旋转、缩放还有平移。
因此我们需要扩散到一个齐次坐标空间
因此对于点的变化我们用 float4 来表示
还有一种理解方式:链接内容
1、点,用Vector4表示就是(x,y,z,1)。*
2、向量,用Vector4表示就是(x,y,z,0)。
那么,向量是两个点相减组成,得到:
(x1,y1,z1,1)- (x2,y2,z2,1) = (x1 - x2, y1 - y2,z1 - z2,0)
就可以表示两个点相减是一个向量。
如果用Vector3表示一个点的话,就不知道两个点相减是什么了。
然后我们再来看看 ShaderLab属性类型和Cg变量类型的匹配关系
这样就能理解为什么使用 float4 类型了。
return UnityObjectToClipPos(v); 把顶点坐标从模型空间转换到剪裁空间;
5.22
5.23
5.24使用属性
@[TOC](5.4 CG/HLSL) 语义:
语义是 一个赋给shader输入和输出的字符串,就是告诉shader从哪里读数据,把数据输出到哪里。