Unity Shader入门精要 --- 阅读笔记 18.07.24

Unity Shader 的形式

01.Unity Shader 的最重要的任务还是指定各种着色器所需的代码.

02.不管哪种形式,真正意义上的 Shader 代码都需要包含在 ShaerLab 语义块中

例:

Shader "MyShader"
{
    
    Properties 
    { 
        // 所需要的各种属性. 
    }
    
    SubShader
    {
        // 真正意义上的 Shader 代码会出现在这里
        // 表面着色器 (Surface Shader) 或者
        // 顶点/片元着色器 (Vertex/Fragment Shader) 或者
        // 固定函数着色器 (Fixed Function Shader)
    }
    
    SubShader
    {
        // 和上一个 SubShader 类似
    }
}

3.4.1 Unity 的宠儿: 表面着色器

01.表面着色器(Surface Shadre), 是Unity 自己创造的一种着色器代码类型.代码量小,渲染代价大.本质和顶点/片元着色器是一致的.表面着色器可以理解为是 Unity 对顶点/片元着色器的更高一层的抽象.

表面着色器示例代码:

Shader "Custom/Simple Surface Shader"
{
    SubShader
    {
        Tags {"RenderType" = "Opaque" }
        CGPROGRAM
        #pragma surface surf Lambert
        struct Input
        {
            float4 color : COLOR;
        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            o.Albedo = 1;
        }
        ENDCG
    }
    Fallback "Diffuse"
}

从这段代码中我们可以看出,表面着色器被定义在 SubShader 语义块 (而非 Pass 语义块) 中的 CGPROGRAM 和 ENDCG 之间.原因是:表面着色器不需要开发者关心使用多少个 Pass,每个 Pass 如何渲染,这些事情 Unity 会在背后为我们处理好.

02.CGPROGRAM 和 ENDCG 之间的代码是使用 CG/HLSL 编写的,也就是说,我们需要把 CG/HLSL 语言嵌套在 ShaderLab 语言中.注意:这里的 CG/HLSL 是 Unity 经封装后提供的,它的语法和标准的 CG/HLSL 语法几乎一样.但是,有些原生的函数和用法 Unity 并没有提供支持.

3.4.2 顶点/片元着色器

01.在 Unity 中,我们可以使用 CG/HLSL 语言来编写 顶点/片元着色器(Vertex/Fragment Shader).它们更加复杂,但灵活性也更高.

示例代码:

Shader "Custom/Simple VertexFragment Shader"
{
    SubShader
    {
        pass    
        {   
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 v : POSITION) : SV_POSITION
            {
                return mul (UNITY_MATRIX_MAP,v);
            }


            fixed4 frag() : SV_Target
            {
                return fixed4(1.0,0.0,0.0,1.0);
            }
            
            ENDCG
        }
    }
}

顶点/片元着色器是写在 Pass 语义块内的,而非 SubShader 内的.原因是:我们需要自己定义每个 Pass 需要使用的 Shader 代码.

3.4.3 被抛弃的角落:固定函数着色器

01.不支持可编程管线着色器,需要使用固定函数着色器(F

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值