Unity中Shader纹理的多级渐远Mipmap

news/2025/1/23 23:15:31/

文章目录

  • 前言
  • 一、什么是Mipmap
  • 二、Mipmap能带来什么好处
    • 1、增加缓存命中率,减少像素抖动感
    • 2、可配合质量设置来分级加载,减少不同配置下的内存
  • 二、我们在Shader中实现一下该效果
    • 1、我们先布置一个简单的棋盘格,用于测试纹理的多级效果
    • 2、我们在Shader的属性面板定义一个范围值
    • 3、使用前先声明一下_Mipmap
    • 4、使用多级采样的函数来进行纹理采样
    • 5、最终效果


前言

Unity中Shader纹理的多级渐远Mipmap


一、什么是Mipmap

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

模型的LOD是:高模、中模、低模
Shader的LOD:可以自己定义高配、中配、低配
纹理的LOD:纹理分级Mipmap,即 512x512(可以更高)、256x256(上一级 / 2)、…… 、1x1

  • Unity中Shader的ShaderLOD

在这里插入图片描述

开启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 100Pass{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}}
}

http://www.ppmy.cn/news/1224192.html

相关文章

第77题. 组合

原题链接&#xff1a;第77题. 组合 全代码&#xff1a; class Solution { private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, int startIndex) {if (path.size() …

在WPF应用程序集中添加新文件时,Page和Window有什么区别

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Window和Page是两种不同类型的容器&#xff0c;可以用来承载和组织用户界面元素。它们都继承自FrameworkElement类&#xff0c;但是它们的使用场景和行为方式有所不同。 Window Window类代表一个…

简单漂亮的首页

效果图 说明 这个首页我也是构思了很久&#xff0c;才想出这个界面&#xff0c;大家喜欢的话&#xff0c;可以拿走去使用 技术的话&#xff0c;采用的就是vue的语法&#xff0c;但是不影响&#xff0c;很多样式我都是直接手敲出来的 代码实现 标语 <!-- 标语 start-->&…

【MySql密码爆破脚本】用于其他爆破工具无法使用的情况下

1、脚本 #!/bin/bash# 脚本参数 username$1 # MySQL用户&#xff08;或字典路径&#xff09; password$2 # MySQL密码&#xff08;或字典路径&#xff09; task_num${3:-32} # 并发数&#xff0c;默认 32# 检查参数是否存在 if [ -z "$username" ] || [ -z "…

中级程序员——vue3+js+git面试题

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;vue3jsgit面试题 文章目录 vue3最大缺点和优点&#xff1f;vue3组合式里面&#xff0c;如何去调用子组件里面的方法&#xff1f;watch和watcheffect有什么区别&#xff1f;计算属性和watch的区别是什…

什么是人工通用智能(AGI)

1 定义 AGI最近经常被提到&#xff0c;主要是因为ChatGPT的开发公司OpenAI将其写在了自己的企业使命中了。"AGI"指的是"人工通用智能"&#xff08;Artificial General Intelligence&#xff09;。这是一个人工智能研究领域的术语&#xff0c;用来描述一种…

RMI协议详解

前言特点应用示例存在的问题应用场景拓展 前言 RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;是Java中的一种远程通信协议&#xff0c;用于实现跨网络的对象方法调用。RMI协议基于Java的分布式计算&#xff0c;可以让客户端程序调用远程服务器…

el-table固定表头(设置height)出现内容过多时不能滚动问题

主要原因是el-table没有div包裹 解决&#xff1a;加一个div并设置其高度和overflow 我自己的主要代码 <div class"contentTable"><el-tableref"table":data"tableData"striperow-dblclick"onRowDblclick"height"100%&q…