Unity中HLSL代码块的基本知识归纳整理
Unity中HLSL代码块的基本知识归纳整理
着色器语义
编写 HLSL 着色器程序时, 输入和输出变量需要通过语义来表明 其“意图”。这是 HLSL 着色器语言中的 标准概念。
语义是附加到着色器输入或输出的字符串,用于传达有关参数预期用途的信息。 在着色器阶段之间传递的所有变量都需要语义.
顶点着色器输入语义
主顶点着色器函数(由 #pragma vertex
指令表示)需要在所有输入参数上都有语义。 这些对应于各个网格数据元素,如顶点位置、法线网格和纹理坐标。
对于 Cg/HLSL 顶点程序, 网格顶点数据作为输入传递给顶点 着色器函数。每个输入都需要有指定的语义:例如,POSITION
输入表示顶点位置,NORMAL
表示顶点法线。
通常,顶点数据输入在结构中声明,而不是 逐个列出。
几个常用的顶点结构:
appdata_base
:位置、法线和一个纹理坐标。appdata_tan
:位置、切线、法线和一个纹理坐标。appdata_full
:位置、切线、法线、四个纹理坐标和颜色。
要访问不同的顶点数据,需要自己声明顶点结构,或者将输入参数添加到顶点着色器。顶点数据由 Cg/HLSL 语义标识,并且必须来自以下列表:
POSITION
是顶点位置,通常为 float3 或 float4。NORMAL
是顶点法线,通常为 float3。TEXCOORD0
是第一个 UV 坐标,通常为 float2、float3 或 float4。TEXCOORD1
、TEXCOORD2
和TEXCOORD3
分别是第 2、第 3 和第 4 个 UV 坐标。TANGENT
是切线矢量(用于法线贴图),通常为 float4。COLOR
是每顶点颜色,通常为 float4。
示例:
我们在unity中创建一个‘Unlit Shader’,可以看见这一部分(我使用的unity版本是2019):
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
从这一部分可以发现,当我们需要读