目录
一、本节介绍
1 上集回顾
2 本节介绍
二、结构体的需求
1 数据的接入
2 开始写结构体
三、unity封装好的结构体
1 unity封装好了很多结构体
2 如何使用封装好的结构体
四、下集预告
一、本节介绍
1 上集回顾
上一集,我们做了一个可以改变颜色的案例。
2 本节介绍
这一集,我们继续讲一个语法,在shader里写结构体。
二、结构体的需求
1 数据的接入
shader里是不好随便去声明数据的,我们前面传入数据时,用的是括号传入(如图),
但是当数据很多的时候,就会不好弄,于是引入新语法,结构体,可以把很多个数据放到一起,像之前一样写代码用。
2 开始写结构体
需求:我们现在有3个语义想用
:POSITION 顶点坐标
:NORMAL 法线坐标
:TEXCOORD0 第一套纹理坐标 //纹理坐标就UV坐标,这里不详细讲解,可以百度
代码:用结构体把这些数据都接过来
//这里结构体的名字是可以自己起的struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;float4 texcoord:TEXCOORD0;}
这样,我们之后再用数据的时候,只需要声明一个结构体,通过结构体调用就可以了
例,修改上一个案例,加入结构体的内容
- 上一个案例的链接:
Unity | Shader基础知识(第三集:案例<对材质颜色进行干预>)-CSDN博客
- 代码写法是:
Shader "Custom/001"
{
SubShader{pass{CGPROGRAM#pragma vertex vert#pragma fragment frag//这里结构体的名字是可以自己起的struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;float4 texcoord:TEXCOORD0;};//传入并声明结构体float4 vert(a2v v):SV_POSITION{//调用结构体的vertexreturn UnityObjectToClipPos(v.vertex);}float4 frag():SV_TARGET{return float4(1,1,1,1);}ENDCG}}
}
三、unity封装好的结构体
1 unity封装好了很多结构体
例:
struct appdata_base {float4 vertex : POSITION;//顶点坐标float3 normal : NORMAL;//法线float4 texcoord : TEXCOORD0;//第一纹理坐标UNITY_VERTEX_INPUT_INSTANCE_ID //ID信息
};struct appdata_tan {float4 vertex : POSITION;//顶点坐标float4 tangent : TANGENT;//切线float3 normal : NORMAL;//法线float4 texcoord : TEXCOORD0;//第一纹理坐标UNITY_VERTEX_INPUT_INSTANCE_ID //ID信息
};struct appdata_full {float4 vertex : POSITION;float4 tangent : TANGENT;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;float4 texcoord1 : TEXCOORD1;//第二纹理坐标float4 texcoord2 : TEXCOORD2;//第三纹理坐标float4 texcoord3 : TEXCOORD3;//第四纹理坐标fixed4 color : COLOR; //顶点颜色UNITY_VERTEX_INPUT_INSTANCE_ID //ID信息
};
2 如何使用封装好的结构体
其实这里又是一种引用,只要我们提前引用就可以使用
之前我们引用过CG语法,还在那个位置,进行引用
- 例:
//之前学的CG引用#pragma vertex vert#pragma fragment frag//unity封装好的部分结构体引用#include"UnityCG.cginc"
- 引用案例:
Shader "Custom/001"
{
SubShader{pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include"UnityCG.cginc"//假设我们要传入 appdata_base//传入上述结构体float4 vert(appdata_base v):SV_POSITION{//调用结构体的vertexreturn UnityObjectToClipPos(v.vertex);}float4 frag():SV_TARGET{return float4(1,1,1,1);}ENDCG}}
}
四、下集预告
下集会根据之前的语法,学习一个数学知识,制作一个彩色的球。