Shaderlab编程入门三

本文详细介绍了Unity中顶点着色器和片段着色器的区别,包括它们的计算单位和主要功能。顶点着色器处理顶点信息,片段着色器处理像素颜色。此外,还讲解了如何在Shader中构建材质属性,例如使用Color、int、float和2D纹理等。同时,文章探讨了变体的概念,展示了如何通过multi_compile宏实现变体功能,以优化shader管理和渲染效果。在Unity中,正确配置变体开关可以观察到其实际效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顶点着色器与片段着色器:

区别:

1、顶点着色器以定位为单位进行计算;片段着色器以像素为单位进行计算;计算复杂度不一样,片段计算次数远大于顶点;

2、顶点着色器一般用于定义每个顶点的如位置信息、颜色信息等,然后传输到片段着色器中;片段着色器一般只输出颜色信息;

材质属性:

材质的属性一般在shader的Properties{}中构建,其中包含且不仅包含Color、int、float、Vector、2D纹理等。

常用的Color可以添加[HDR]让颜色实现高光动态渲染,int可以添加[Toggle]可以让该值实现勾选功能,float可以添加[intRange]绘制一个int输入的滑杆,2D纹理可以添加[NoScaleOffset]可以实现图片不能偏移和缩放(还有其他很多如Enum、搭配变体等功能,后面会做个专题)。

变体:

变体类似于C#开发中的宏,通过特定的开关来执行指定的渲染方式

变体的优点在于将多个类似的功能集成到一个shader里面,便于使用和管理

缺点在于加载时间过长,并导致内存增加。

变体的定义:

可以在此处看到变体的数量:

首先在properties中定义变体开关,然后定义变体,通过#if 与#endif 来制作类似于变体的宏从而实现变体功能,需要注意的是,该方法需要名字对应且都需要大写。

整体代码如下:

Shader "chen/Multi_Compile"
{
    Properties
    {
        [Toggle]_MULTICOMPILETEST("变体测试",int) = 0
    }
    SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma multi_compile _ _MULTICOMPILETEST_ON
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 pos:POSITION;
                float4 uv:TEXCOORD;
            };
            struct v2f
            {
                float4 pos:SV_POSITION;
                float4 uv:TEXCOORD;
            };
            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.pos);
                o.uv.xy = v.uv.xy;
                return o;
            }
            fixed4 frag(v2f i):SV_TARGET
            {
                fixed4 c=1;
               #if _MULTICOMPILETEST_ON
                    c=0.5;
                #endif
                return c;
            }
            ENDCG
        }
    }
}


回到Unity中,可以看到变体已经生效了:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值