编写简单的顶点/片元着色器
下面是一个最基础的UnityShader代码。在一个UnityShader中,Properties语义并不是必须的,我们可以不声明任何材质属性。SubShader中的渲染设置和标签设置也不是必须的,在没有声明的情况下SubShader会使用默认的渲染设置和标签设置。
Shader "Unlit/class02"
{
SubShader
{
Pass
{
CGPROGRAM
// 下面两行代码将告诉Unity,哪个函数包含了顶点着色器,哪个函数包含了片元着色器
#pragma vertex vert // 顶点着色器
#pragma fragment frag // 片元着色器
// POSITION和SV_POSITION都是语义,分别指明输入的四维数和返回的四维数是什么类型
// POSITION存储模型空间坐标 SV_POSITION存储裁剪空间坐标
float4 vert(float4 v:POSITION):SV_POSITION
{
// 把顶点坐标从模型空间转换到裁剪空间
return UnityObjectToClipPos(v);
}
// 片元着色器中的代码返回了一个表示白色的float4类型的变量,并将输出的颜色存储到一个渲染目标中
fixed4 frag():SV_TARGET
{
return fixed4(1,1,1,1);
}
ENDCG
}
}
}
最后的效果显示为一个白色的球

在上面的代码中,我们用POSITION语义获取到了模型的顶点位置,但如果要获取到更多的模型数据怎么办呢?同样的,有时我们也想从顶点着色器输出一些数据,如法线、纹理坐标等传递给片元着色器,这时又该怎么办呢?
我们很容易想到,可以将参数封装成一个类或结构体。Unity Shader中没有类的概念,但结构体是有的。
下面是结构体的应用:
Shader "Unlit/class03"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 输入结构体
struct a2v
{
float4 v:position;

本文介绍了Unity Shader的基础知识,包括如何编写简单的顶点和片元着色器,使用结构体传递模型数据,以及通过Properties语义在Inspector面板控制颜色。讲解了UnityCG.cginc库文件的应用,以及CG/HLSL中的语义概念,如SV_POSITION、COLOR0等,并展示了如何通过ShaderLab属性类型控制颜色。
最低0.47元/天 解锁文章
674

被折叠的 条评论
为什么被折叠?



