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

news2024/11/17 3:39:37

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再进行一次线性插值,从而得到最终的采样结果。

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

河北霖超新材料科技有限公司邀您见证2024杭州数字物流展行业变革

参展企业介绍 河北霖超新材料科技有限公司是一家塑胶注塑制品生产的民营企业。是集模具开发、注塑加工、塑胶制品于一体的塑料配套产品解决方案提供商。主营:ABS塑料件、尼龙垫片、尼龙滑轮、护丝帽、聚氨酯制品、尼龙制品等产品。霖超公司发展几年来生产过几百种产…

AWS基础之Region/AZ/DC概念

从云厂商提供的服务物理地域上来划分,范围从大到小依次是Region-Available Zone-Data Center。 Region(区域):区域与区域之间的距离大概是几百公里或者几千公里。(可以理解为:中国和美国在不同的区域) Available Zon…

SpringBoot学习之SpringBoot(一)之初始化

SpringBoot(一)之初始化 文章目录 SpringBoot(一)之初始化SpringBoot框架 SpringBoot简化配置1. 创建SpringBoot项目关于初始化错误 2. SpringBoot项目结构主类pom.xml1. 关于spring-boot-starter-parent2. 关于spring-boot-starter-web3. 关于spring-boot-starter-test4. 关于…

达梦sql中参数个数太多导致出现SOH等特殊字符报错无效的序列号是不是达梦的bug

mybatis的Mapper.xml中如下: in中的参数大概有1万6千多个,分成每1000个一组拼接成sql,然而在达梦中执行时报如下: Caused by: dm.jdbc.driver.DMException: Invalid sequence noat dm.jdbc.driver.DBError.throwException(DBError.java:710)…

今日分享丨从简单传输到大文件分片上传

在数字化信息时代,文件传输技术的重要性不言而喻。从个人用户日常的文档、图片分享,到企业级的数据交换、云服务存储,再到科研领域庞大的数据集传输,文件传输技术的应用场景日益广泛,需求也日益增长。从简单的文本文件…

Airtest核心API汇总

2024.2.25更新:新增剪切板、Airtest1.3.3touch/swipe支持绝对坐标和相对坐标 2023.9.3更新:Airtest1.2.7新增14个断言、断开连接API;Airtest1.2.10.2新增录屏API; 以下基于airtest1.2.0(截止2021.7.12,最新版本) https…

gif动画图片如何生成?分享制作gif的小妙招

Gif动画图片的制作过程是非常好玩的,通过自制gif表情包让你在社交媒体中与朋友互动更容易。可以通过这种gif表情包的方式来表达你的情感,传递信息,让朋友更容易理解你的想法。想要制作gif动画只需要使用gif动画制作(https://www.g…

非对称加密算法在区块链中的应用

随着数字技术的迅猛发展,区块链技术因其独特的去中心化、不可篡改、透明公开等特性,逐渐成为各行各业关注的焦点。在区块链技术的众多组成部分中,非对称加密算法无疑是其中最为基础和关键的一环。本文旨在探讨非对称加密算法在区块链中的应用…

C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数

目录 什么是多态性? 概念 分类 向上类型转换 功能的早绑定和晚绑定 绑定 绑定与多态的联系 编译时多态(功能的早绑定) 运行时多态(功能的晚绑定) 一般而言 实现功能晚绑定——虚函数 虚函数定义的说明 什么…

CSS表格特殊样式

列组样式 使用colgroup与col标签配合可以定义列祖样式&#xff1a;例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>table,tr,th,td{border: 1px solid #000;}table{border-collapse: coll…

Meilisearch使用过程趟过的坑

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

基于SVPWM控制策略的二极管钳位型NPC逆变器并网闭环simulink仿真

本人搭建了基于SVPWM控制策略的二极管钳位型NPC逆变器并网闭环的simulink仿真模型&#xff0c;该模型采用SVPWM闭环控制实现并网控制。效果优异&#xff0c;配备参考资料&#xff0c;适合新手学习使用。 DC&#xff1a;800V AC:380V 功率&#xff1a;100kw 拓扑&#xff1a;…

fastjson_1.2.24和Shiro(CVE-2016-4437)漏洞复现

文章目录 一、fastjson 1.2.24远程命令执行漏洞复现二、shiro反序列化漏洞(CVE-2016-4437)1、Shiro漏洞原理2、手工验证漏洞3、使用ShiroAttack2 一、fastjson 1.2.24远程命令执行漏洞复现 配置环境&#xff1a;本机java 8环境 kali操作系统&#xff08;java8&#xff09; c…

如果你想学习大数据,那么你应该看看这些高分佳作

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java人自己的交流群“共同富裕的 Java 人”。 今天和大家分享的主题是&#xff1a;大数据入门书籍。公众号内回复关键字&#xff1a;20240515&#xff0c;即可获取。 &a…

【正版系统】海外短剧系统功能介绍,前端uniapp+开源。

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、海外短剧系统功能介绍 二、搭建要求 1.系统要求 总结 前言 短剧作为一种快速、紧凑的娱乐形式&#xff0c;正逐渐受到更多海外观众的喜爱。这种需求增长为…

基于RTL8710BN与天猫精灵的WIFI智能家居方案

0 项目简介 目的&#xff1a; 语音控制智能家居产品 基于阿里云的物联网产品 基于WiFi技术的嵌入式产品 主要技术&#xff1a; WiFi技术 常用的物联网协议 网络编程 云平台配置 MCU OPENSDK开发 阿里物联网操作系统 硬件&#xff1a; wifi开发板RTL8710BN 天猫精灵…

版本控制:软件开发的基石(一文读懂版本控制)

未经允许&#xff0c;禁止转载&#xff01; 在现代软件开发中&#xff0c;版本控制是不可或缺的工具。它帮助开发者跟踪和管理代码的变化&#xff0c;协作完成项目&#xff0c;并确保代码的完整性和安全性。本文将基于Git官网的视频“什么是版本控制”来深入探讨版本控制的基本…

Linux常用指令集合

ls显示目录文件 选项&#xff1a; -a 所有文件&#xff08;all所有&#xff09; -l 详细信息&#xff08;Information信息&#xff09;&#xff08;自动包含-1&#xff09; 所以常用 ll -1 一行只输出一个文件。 -R 列出所有子目录下的文件。…

优雅谈论大模型4:初识Token

Token 在继续前行之前&#xff0c;需要先停下来澄清下Token这个词&#xff0c;以及如何将原始的语料转化为Token&#xff0c;在细究背后的原理之后会更加优雅的理解大模型。任何的资讯都可以生成语料&#xff0c;而这些语料需要被机器理解以及供后续的模型训练&#xff0c;那么…

Nginx配置Referer防盗链

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 HTTP Referer是Hea…