当前位置: 首页 > news >正文

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样

我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。

理想情况下,屏幕上的每个像素都可以正好对应到纹理上的一个纹素。
在这里插入图片描述
如上图这种情况,将3X3的纹理显示到3X3的屏幕上时,屏幕坐标(1,1)的像素对应的正好也是纹理上(1,1)的纹素。图中黑点代表的是每个纹素的位置,红点代表的是屏幕像素映射到纹理上的位置(uv),此时只需要取对应纹素的颜色进行显示即可。

但在实际情况中,纹理采样的范围与显示该纹理的屏幕范围并不是一一对应的,并且在透视相机下,随着纹理所附着的物体与摄像机间的距离改变,其占据的屏幕空间的大小也会发生变化,也就是纹理覆盖的屏幕区域的大小会发生变化。这就会出现纹理过小和纹理过大两种情况。

2. 纹理过小

当物体靠近透视相机,占据的屏幕空间变大,屏幕上更大范围的像素会被用来显示物体身上的纹理,就会出现纹理过小的情况。

在这里插入图片描述

比如上图3X3的纹理需要显示在6X6的屏幕范围上时,图中红点和黄点分别代表屏幕空间的前两个像素,此时二者都对应纹理空间的第一个纹素,且其采样位置也不是正好在纹素的位置。可见,纹理过小时会出现多个像素拥挤到同一个纹理像素上,并且纹理与屏幕范围差距越大,拥挤到同一个纹素上的像素数量越多。

3. 就近点采样

在这里插入图片描述
就近点采样是最简单的滤波方式,如上图所示情况,红点为屏幕像素映射到的位置,当使用就近点采样进行滤波时,会查找距离目标最近的纹素进行采样,也就是图中的蓝点对应的纹素。

就近点采样速度快,但问题也很明显,当纹理过小且纹理与屏幕范围差距较大时,如果采用就近点采样,就会导致大片的像素都采样到同一个颜色,使渲染出来的图像看起来一块一块的,颗粒感(或像素化)严重。

4. 双线性插值

在这里插入图片描述
在双线性插值中,会考虑离采样点最近的四个纹素作为参考点,也就是上图中P1 P2 P3 P4四个蓝点,然后根据采样点与参考点的水平距离,对P1 P2进行插值得到新参考点P5的颜色、对P3 P4进行插值得到新参考点P6的颜色
在这里插入图片描述
之后根据采样点与参考点之间的纵向距离对新参考点P5P6进行插值,从而得到最终的采样颜色。

双线性插值通过两次插值计算,使采样结果在一定程度上反映出采样点附近的综合颜色,且速度也较快,是最常用的滤波方式。

5. 纹理过大

当物体远离透视相机,占据的屏幕空间变小,物体身上的纹理只能被显示在屏幕上很少的几个像素上,就会出现纹理过大的情况。
在这里插入图片描述
当出现纹理过大时,如将6X6的纹理显示在4X4的屏幕范围内,一个屏幕像素内就需要塞下多个纹素,上图中红框和黄框代表相邻两个屏幕像素对应的纹素范围。

由于一个像素无法包含如此多的颜色,因而会导致纹理信息丢失,并进一步导致相邻像素间颜色信息不连贯,从而产生摩尔纹或者锯齿化的现象。

6. Mip Map

纹理过大问题的本质是一个像素无法表达多个纹素而导致的颜色信息丢失,最直观的解决方案便是对单个屏幕像素覆盖的多个纹素进行多次采样,然后按照取平均值或者其他方式进行合并,以最终的合并结果作为采样得到的颜色值,也就是超采样技术。

实时超采样的开销无疑是巨大的,为了提升采样速度,我们可以按照一定范围将纹素提前进行合并,生成一张新的纹理,当需要进行超采样时,只要对新生成的纹理直接采样显示即可。

另外一个问题是,当物体与透视相机的距离发生改变,单个屏幕像素要表达的纹素数量也会发生变化,为了使采样结果更加可靠,我们可以以像素覆盖纹素的数量作为依据划分几个等级,计算每个等级需要合并的纹素范围,生成多张新纹理,在渲染时选择对应等级的新纹理进行采样。

以上便是MipMap的原理。

在MipMap中,以原始纹理作为Level 0。将当前Level D的相邻四个像素进行合并,生成次一级的纹理Level D + 1。在渲染时,根据相邻屏幕像素的UV坐标最大距离,算出每个屏幕像素覆盖的纹素范围L,然后对L取对数即可得到对应的MipMap等级D。最后从已经提前生成的Level D级的纹理中进行采样。

7. 三线性插值

由于我们是通过 D = Log2L 的方式计算得到的纹理等级,因此实际计算得到的D是一个连续值,而提前生成的纹理等级是离散的,要根据连续的D值对相应等级的纹理进行采样,通常有两种方式,一种是对其进行四舍五入得到就近的纹理等级,另一种就是三线性插值采样。

在三线性插值采样中,会按照计算得到的D值分别向下和向上取整,得到两个等级D1和D2,然后从D1和D2级纹理中各自进行一次双线性插值采样S1和S2,最后根据D值与D1D2的差距对S1S2再进行一次线性插值,从而得到最终的采样结果。

在这里插入图片描述

三线性插值的采样结果更好,但速度也更慢,因此一般都只用双线性插值采样。

相关文章:

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。 理想情况下,屏幕…...

JeeSite Vue3:前端开发页面如何动态设置菜单展示模式?

推荐阅读: JeeSite Vue3:前端开发的未来之路(更新版) 随着技术的飞速发展,前端开发技术日新月异。在这个背景下,JeeSite Vue3 作为一个基于 Vue3、Vite、Ant-Design-Vue、TypeScript 和 Vue Vben Admin 的前端框架,引…...

微信小程序-禁止页面下拉回弹

微信小程序-禁止页面下拉回弹,主要是pages.json中的这3个配置: "enablePullDownRefresh": false, 这个配置项用于控制页面是否支持下拉刷新。当设置为false时,用户无法通过下拉页面来触发刷新操作。 "disableScroll": true, 这个配置项用于控…...

测试环境搭建整套大数据系统(十六:超级大文件处理遇到的问题)

一:yarn出现损坏的nodemanger 报错现象 日志:1/1 local-dirs usable space is below configured utilization percentage/no more usable space [ /opt/hadoop-3.2.4/data/nm-local-dir : used space above threshold of 90.0% ] ; 1/1 log-dirs usabl…...

C++ 并发编程指南(11)原子操作 | 11.6、计算机内存结构

文章目录 一、计算机内存结构1、内存的基本组成2、内存的类型3、内存的结构层次4、CPU架构5、局部性原理6、总结 前言 在探讨计算机的运行效率和数据处理能力时,内存结构无疑是一个至关重要的部分。内存,作为计算机系统中的关键组件,承担着存…...

正则表达式教程

正则表达式在线工具网站:https://regexr.com...

SEO之为什么研究关键词(二)

初创企业需要建站的朋友看这篇文章,谢谢支持: 我给不会敲代码又想搭建网站的人建议 新手上云 (续上一篇。。。。。) 3、寻找有效流量 排名和流量都不是目的,有效流量带来的转化才是目的。就算公司有足够的实力将一些…...

Mysql 创建索引

1. 在创建表时添加索引 在使用CREATE TABLE语句创建表的同时,可以直接定义索引。例如,创建一个包含索引的表: CREATE TABLE clothes (id INT PRIMARY KEY,c_brand VARCHAR(100),c_type VARCHAR(50),c_size VARCHAR(10),price DECIMAL(10, 2…...

vaspkit 画 Charge-Density Difference

(echo 314;echo $(cat 1))|vaspkit 文件1提前写好使用的CHGCAR路径 SPIN_DW.vasp ../ML2scf/SPIN_DW.vasp ../ML1scf/SPIN_DW.vasp POSite and negative 默认为blue,and 青色 (RGB 30 245 245) 正值:blue 。负值:青色 RGB 30 245 245。 提示&…...

FreeRTOS缩小bss段的处理

bss太大了,有60多M,客户要求处理一下 readelf -s app.elf | grep "OBJECT" 发现有一条 592: 8800dd78 0x4000000 OBJECT LOCAL DEFAULT 15 ucHeap 长度64M,地址8800dd78刚好在bss段里,bss段地址如下&#xff…...

STM32数字示波器+详细注释+上位机程序+硬件

目录 1、设计指标: 2、功能: 3、上位机的程序 ​4、测试的照片 5、PCB 6、模拟电路板 7、程序 资料下载地址:STM32数字示波器详细注释上位机程序硬件 1、设计指标: 主控: STM32…...

【平衡二叉树】AVL树(双旋)

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解AVL树的左双选和右双旋的相关内容。 如果看到最后您觉得这篇文章写…...

【保姆级介绍自动化的讲解】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

【大数据面试题】27 讲下Doris的物化视图

一步一个脚印,一天一道面试题。 物化视图概念 物化视图,顾名思义,是将一个查询的结果预先计算并存储为物理表的形式。这意味着,原本需要在运行时动态执行的复杂查询,现在变成了直接从已经计算好的结果表中读取数据&a…...

kylin 使用心得

Kylin操作系统是一种基于Linux的操作系统,主要在中国使用,由中国国内的开发团队维护。它的目标是为了提供一个稳定、安全、易于使用的操作环境。以下是一些用户可能基于Kylin操作系统的使用心得: 1. **界面友好**:Kylin操作系统通…...

在线音乐系统

文章目录 在线音乐系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目(9.9¥带走) 在线音乐系统 一、项目演示 音乐网站 二、项目介绍 基于springbootvue的前后端分离在线音乐系统 登录角色 : 用户、管理员 用…...

LeetCode算法题:49. 字母异位词分组(Java)

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …...

第五课,输入函数、布尔类型、比较运算和if判断

一,输入函数input() 与输出函数print()相对应的,是输入函数input(),前者是把程序中的数据展示给外界(比如电脑屏幕上),而后者是把外界(比如键盘)的数据输入进程序中 input()函数可…...

数学建模——线性回归模型

目录 1.线性回归模型的具体步骤和要点: 1.收集数据: 2.探索性数据分析: 3.选择模型: 4.拟合模型: 5.评估模型: 1.R平方(R-squared): 2.调整R平方(Ad…...

景源畅信:抖音小店比较冷门的品类分享?

在抖音小店的世界里,热门品类总是吸引着众多商家和消费者的目光。然而,就像星空中的繁星,虽不那么耀眼却依然存在的冷门品类同样值得我们关注。它们或许不似服装、美妆那样日进斗金,但正是这些小众市场的存在,为平台带…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...