Unity Shader代码入门基础

写这篇文章主要是帮助自己理解代码的框架结构以及变量、函数的使用,旨在理解框架和流程,不对变量和函数进行详细解析;认知是不断刷新的,故这篇文章只能起到一种抛砖引玉的效果。


1、Shader“名字”(可加目录/名字)

        注意:Shader“名字”!=Shader文件名字

2、材质和Unity Shader的桥梁:Properties语义块

        该语义块包括了一系列的属性。

        定义:属性名称("Unity面板中显示名称",指定类型)=默认数值

        如下图:包括了常用的属性值:浮点型、范围、四维参数、颜色值、贴图

 显示效果:

3、SubShader语义块(可以有多个,至少有一个)

SubShader{
    //[]内可选
    [Tags]//字符串键/值对,SubShader与渲染引擎之间的沟通桥梁
          //它们用来告诉Unity的渲染引擎:我希望怎样以及何时来渲染这个对象
    
    [RenderSetUp]//渲染状态的设置指令,可以设置显卡的各种状态

        Pass//定义了一次完整的渲染流程(但如果Pass数目过多,往往会造成渲染性能的下降)
        {
            CGPROGRAM//与ENDCG相呼应,是UnityCG所要求的格式

            //在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量
            //!!!!一定是匹配的名字!!!!
            //可以通过Unity的面板传入Shader中
            float4 _Color;
    
            #pragma vertex vert//顶点着色器,逐顶点执行
            #pragma fragment frag//片元着色器            
            #include "UnityCG.cginc"//引入Unity的头文件

            ENDCG
        }        
    
    
    Fallback "name"/Off
 //为“name”时:用于告诉Unity,如果上面所以SubShader在这块显卡上都不能运行,
   那就使用这个最低级的Shader吧!例:Fallback "VertexLit"

 //为“Off”时:如果一块显卡都跑不了上面所以的SubShader,那就不要管它了!
}

 4、SubShader中的结构体:

//application to vertex shader (将模型数据从应用阶段传递到顶点着色器)
struct a2v {
       float4 vertex :POSITION;//float4类型获取语义POSITION(模型的顶点坐标)
       float3 normal :NORMAL;//模型的顶点法线
       float4 texcoord:TEXCOORD0; //纹理
};


//vertex shader to fragment shader(将数据从顶点着色器传递到片元着色器)
struct v2f {
       float4 pos:SV_POSITION;
      //SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
};

 5、顶点/片元着色器:

顶点着色器:将物体从Object Space经过MVP矩阵变换到Clip Space

下图一步步变换:

在查阅2022.3版本的Unity手册时,发现Unity有新的方法可以“一步到位”,直接将数据从对象空间转换到裁剪空间:UnityObjectToClipPos();

struct v2f {
       float4 pos:SV_POSITION;
      //SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间中的位置信息
};

//顶点着色器vert:传入模型数据——图元装配
v2f vert(a2v v)
{
    v2f o;
    
    float4 pos_world=mul(_Object2World,v.vertex);//模型空间转世界空间
    float4 pos_view=mul(UNITY_MATRIX_V,pos_world);//世界空间转相机空间
    float4 pos_clip=mul(UNITY_MATRIX_P,pos_view);//转到裁剪空间
    o.pos=pos_clip;
    
    return o;//返回数据给顶点着色器所需结构体v2f
}

//片元着色器frag:返回float4类型的颜色值 SV_Target为渲染对象——光栅(像素)化
float4 frag(v2f i):SV_Target
{
    //较简单的返回值
    return _Color;
}

 用通俗一点的理解:a2v实现了将"模特"从”家“中请到了摄影棚(获取模型数据),v2f实现了为模特打上灯光、加上特效(为模型实现效果)


 参考文章:

Unity Shder入门精要

【TA入门】CS0102:Shader代码入门基础_哔哩哔哩_bilibili

更多Unity变量:Unity - Manual: Built-in shader variables (unity3d.com)

更多Unity语义:Unity - Manual: Providing vertex data to vertex programs (unity3d.com)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值