Unity中Shader语义的理解
前言
? ? ? ? 以下内容主要是个人理解,如有错误,欢迎严厉批评指正。
一、语义的形式在Shader中是必要的吗?
? ? ? ? 不是必要的。
? ? ? ? 使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。
二、语义的意义?
-
语义是什么?? ? ? ??
????????语义实际上是显存种特定存储位置的标记。
-
vertex对应方法的输入结构体中的语义
? ? ? ? 通常在??vertex??对应的方法(就是通常命名为vert的方法)中使用的输入结构体中的语义与内容之间是严格相关的,参考下面的代码中的结构体:
struct appdata
{
float3 pos:POSITION;
float2 uv:TEXCOORD0;
};
? ? ? ? 在HLSL环境下,可以认为应用程序向GPU传递数据时,事先约定好在POSITION语义所对应的存储位置是存放模型基于自身坐标的顶点的位置信息。类似的,TEXCOORD0这个语义所对应的存储位置也是约定好存放模型默认的uv信息的。当一个结构体定义的目的是向??vertex??对应的方法中传递信息的时候,所有变量对于这些约定必须严格遵循,否则取不到正确的数据!
-
从vertex对应的方法向fragment对应的方法传递内容的结构体中的语义
????????如果定义的结构体的用途是将数据从vertex对应的方法处理好再传递给fragment对应的方法(就是通常命名为frag的那个方法),就只有一个SV_POSITION是约定好的,保存顶点在裁剪空间中的位置。其它并没有约定,所谓语义只对应了一个存储位置,比如下面代码中的uv使用了语义TEXCOORD0,其实你使用NORMAL啥的也行。
struct v2f
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
};
-
fragment对应的方法的返回值的语义
? ? ? ? 对于fragment对应的方法的返回值,?SV_TARGET 的语义约定也是必须的,因为程序后续要在SV_TARGET所对应的存储位置取值。示例代码如下:
float4 frag(v2f 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? ? ? ? ? ? ? ? 深度值
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!