Unity中Shader纹理的多级渐远Mipmap

文章目录


前言

Unity中Shader纹理的多级渐远Mipmap


一、什么是Mipmap

Mipmap可以理解为纹理的LOD,即纹理的质量分级

模型的LOD是:高模、中模、低模

Shader的LOD:可以自己定义高配、中配、低配

纹理的LOD:纹理分级Mipmap,即 512x512(可以更高)、256x256(上一级 / 2)、...... 、1x1

开启Mipmap的缺点:会多占用30%的显存


二、Mipmap能带来什么好处

1、增加缓存命中率,减少像素抖动感

  • 我们先在纹理的设置里,关闭多级渐远功能,看一下抖动

开启后,抖动就少了

2、可配合质量设置来分级加载,减少不同配置下的内存


二、我们在Shader中实现一下该效果

测试目标:使用一个滑动条来控制纹理的渐变等级

1、我们先布置一个简单的棋盘格,用于测试纹理的多级效果

2、我们在Shader的属性面板定义一个范围值

IntRange\]_Mipmap ("Mipmap",Range(0,10)) = 0

[IntRange]用来变更的值是整数
Range的范围是自己指定的:一般 最大范围在(0,12) , 因为最大贴图是 4096 x 4096

3、使用前先声明一下_Mipmap

half _Mipmap;

4、使用多级采样的函数来进行纹理采样

tex2Dlod(samper2D tex,float4 s)
二维纹理采样,s.w表示采样的是mipmap的几级,仅在ES3.0以上支持.

因为需要传入一个四维变量,但是我们的 uv 是2维的,所以 s.z 我们置零处理

复制代码
fixed4 frag (v2f i) : SV_Target
 {
 	float4 uvMipmap = fixed4(i.uv,0,_Mipmap);
	fixed4 col = tex2Dlod(_MainTex, uvMipmap);
	return col;
 }

5、最终效果

记着开启棋盘格的多级渐远选项

最终代码:

复制代码
//纹理的多级渐远 Mipmap
Shader "MyShader/P2_1_2"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [IntRange]_Mipmap ("Mipmap",Range(0,10)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            half _Mipmap;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float4 uvMipmap = fixed4(i.uv,0,_Mipmap);
                fixed4 col = tex2Dlod(_MainTex, uvMipmap);
                return col;
            }
            ENDCG
        }
    }
}
相关推荐
weixin_4242946717 小时前
在Unity中,摄像机移动时出现“残影”或“闪烁”是常见问题,主要原因和处理方法。
unity·游戏引擎
孟无岐17 小时前
【Laya】Browser 使用说明
typescript·游戏引擎·游戏程序·laya
天人合一peng17 小时前
unity 3d 通过游戏对象的名子查到其对象
游戏·unity·游戏引擎
纯属个人爱好19 小时前
Unity2020+PicoNeo3Pro开发
unity·vr
__water1 天前
RHK《Unity接入DeepSeek问答》
unity·游戏引擎·智能问答·deepseek接入·deepseekapikey
康de哥1 天前
MCP Unity + Claude Code 配置关键步骤
unity·mcp·claude code
美团骑手阿豪1 天前
Unity3D大规模点击检测:GPU Picking vs MeshCollider + Raycast
unity
在路上看风景1 天前
1.4 Unity运行时路径
unity·游戏引擎
郝学胜-神的一滴1 天前
Qt OpenGL 生成Mipmap技术详解
开发语言·c++·qt·系统架构·游戏引擎·图形渲染·unreal engine
孟无岐2 天前
【Laya】Laya 类使用说明
typescript·游戏引擎·游戏程序·laya