Unity中Shader语义的理解

发布时间:2023年12月17日

前言

? ? ? ? 以下内容主要是个人理解,如有错误,欢迎严厉批评指正。

一、语义的形式在Shader中是必要的吗?

? ? ? ? 不是必要的。

? ? ? ? 使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。

二、语义的意义?

  • 语义是什么?? ? ? ??

????????语义实际上是特定数据存储位置的标记。

  • vertex对应方法的输入结构体中的语义

? ? ? ? 通常在??vertex??对应的方法(就是通常命名为?vert?或者 UnlitPassVertex 之类的那个方法)中使用的输入结构体中的语义与内容之间是严格相关的,参考下面的代码中的结构体:

struct attribute
{
	float3 posOS:POSITION;
	float2 uv:TEXCOORD0;
};

? ? ? ? 在HLSL语言环境下,可以认为应用程序向GPU传递数据时,事先约定好在POSITION语义所对应的存储位置是存放模型基于自身坐标的顶点的位置信息。类似的,TEXCOORD0这个语义所对应的存储位置也是约定好存放模型默认的uv信息的。当一个结构体定义的目的是向??vertex??对应的方法中传递信息的时候,所有变量对于这些约定必须严格遵循,否则取不到正确的数据!

  • 从vertex对应的方法向fragment对应的方法传递内容的结构体中的语义

????????如果定义的结构体的用途是将数据从vertex对应的方法处理好再传递给fragment对应的方法(就是通常命名为? frag 或者?UnlitPassFragment 的那个方法),就只有一个SV_POSITION语义是约定好的,这个语义对应的是顶点在裁剪空间中的位置。其它语义并没有约定,所谓语义只对应了一个存储位置,比如下面代码中的uv使用了语义TEXCOORD0,其实你使用NORMAL啥的也行。

struct Varying
{
	float4 posCS:SV_POSITION;
	float2 uv:TEXCOORD0;
};
  • fragment对应的方法的返回值的语义

? ? ? ? 对于fragment对应的方法的返回值,?SV_TARGET 的语义约定也是必须的,因为程序后续要在SV_TARGET所对应的存储位置取值。示例代码如下:

float4 frag(Varying IN):SV_TARGET
{
	float4 texColor = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,IN.uv);
	return texColor * _MainColor;
}

常用语义:

????????POSITION? ? ? ? ? ?表示这个变量用于存储模型基于自身坐标的顶点的位置信息。

????????SV_POSITION? ? 指定顶点的位置,通常用于顶点着色器输入。

????????SV_TARGET? ? ? ?指定像素颜色输出的目标缓冲区,通常用于像素着色器输出。

????????TEXCOORD????????指定纹理坐标,用于从纹理中采样颜色。

????????COLOR? ? ? ? ? ? ? ? 指定顶点或像素的颜色。

????????NORMAL? ? ? ? ? ? ?指定顶点或像素的法线向量。

????????TANGENT? ? ? ? ? ?指定顶点或像素的切线向量。

????????BINORMAL? ? ? ? ?指定顶点或像素的副法线向量。

????????DEPTH? ? ? ? ? ? ? ? 深度值

文章来源:https://blog.csdn.net/ttod/article/details/134966163
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。