Notifications
Article
Shader 结构体中语义的解释
Published 16 days ago
518
2
很多新手都会遇到的难以理解的问题,便把以前自己的思路总结分享一下
Shader编写通常会遇到语义
float4 vert(float4:POSITION):SV_POSITION
{
return mul(UNITY_MATRIX_MVP,v);
}
POSITION与SV_POSITION都是Cg/HLSL中的语义,是不可省略的。
float4:POSITION就是将模型的顶点坐标作为vert()的参数。
有时候顶点处理函数vert()需要更多的参数,这时候就用到了结构体作为输入。
struct input_data
{
float4 vertex : POSITION;//模型顶点坐标
float4 texcoord : TEXCOORD0;//材质的第几套纹理坐标
};
float4 vert(input_data m):SV_POSITION
{
return mul(UNITY_MATRIX_MVP,m.vertex);
}
当然也可以采用结构体来进行输出。
Shader "Custom/red" {
SubShader {
Pass{
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma vertex vert
#pragma fragment frag
struct input_data
{
float4 vertex : POSITION;//模型顶点坐标
float3 normal:NORMAL;//法线,凑结构体数用的,实际没用
float4 texcoord : TEXCOORD0;//材质的第几套纹理坐标,凑结构体数用的,实际没用
};
struct output_data
{
float4 pos: SV_POSITION;//SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间的位置信息
fixed3 color : COLOR0;
};
output_data vert(input_data i)
{
output_data o;
o.pos=mul(UNITY_MATRIX_MVP,i.vertex);
o.color=fixed3(1.0,0,0);
return o;
}
fixed4 frag(output_data m):SV_Target//将颜色显示在屏幕上,SV_Target表示把输出的数据当做颜色存储到渲染目标中,用COLOR也可以
{
return fixed4(m.color,1);//输出红色
}
ENDCG
}
}
}
由上述代码可以看出vert的输出结构体被输出到frag函数中了。
仔细一想,这些结构体只有输入的结构体比较重要,与外部数据息息相关。input_data接收了模型的顶点位置,法线和贴图坐标。把这些宝贵信息送给顶点着色器函数vert();
而自定义的输出结构体其实和外界数据就没什么关系,顶多作为数据的存储载体,给片段着色器提供数据罢了,标上语义也就是个形式,注意语义还是要写的,虽然没啥意义。
但是SV_POSITION是个例外,顶点着色器的输出结构体中必须包含它,否则渲染器将无法得到裁剪空间中的顶点坐标,也就无法把顶点渲染到屏幕上。毕竟顶点着色器,如果输出的连顶点坐标都没了,便没有意义。
unseenstone
Individual developers - Programmer
5
Comments
chen
5 days ago
关注了
0
a
a332665157
14 days ago
很好懂,希望坚持写下去,持续关注
0