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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AcqKnowledge 5.0使用方法

Biopac 数据导入 matlab 处理方法 第一步:在 AcqKnowledge 软件中,将数据通道的 mark 信息导入到 Graph,并将数据存储为 acq3 的格式 第二步:MATLAB中读取acq3文件脚本 clc clear %%%所有被试这一层路径 pathsub fullfile(file…

【JavaEE】HTTP 协议

文章目录 一、HTTP 协议1、HTTP 是什么2、理解 "应用层协议"3、理解 HTTP 协议的工作过程4、HTTP 协议格式5、HTTP 请求 (Request)5.1 认识 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作过程3.1 对称加密3.2 非对称加密3.3 证书3.4 完…

iOS——消息传递和消息转发

消息传递(Message Passing): 在 iOS 中,消息传递机制是基于 Objective-C 语言的动态性质的一种编程方式。这种机制主要涉及到两个概念:发送者(即消息的发送对象)和接收者(即消息的接…

RS422一主多从MAX3490

RS422一主多从MAX3490 最近项目用到了RS422一主多从,一个主机4个从机。芯片用的MAX3490,几经折腾,最终只能从一拖4改为一拖2。 主机发送端,从机4个接收端都是正常的,没有问题。波形非常完美,没有太大变形 …

matlab使用2-基础绘图

matlab使用2-基础绘图 文章目录 matlab使用2-基础绘图1. 二维平面绘图2. 三维立体绘图3. 图形窗口的分割 1. 二维平面绘图 % 创建一些二维数据 x 0:0.01:10; % x轴的数据点,从0到10,间隔为0.01 y sin(x); % y轴的数据点,是x的正弦…

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

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

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt(中的一个控件,它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…

转发_重定向

1.Servlet/JSP单独使用的弊端 当我们用Servlet或者JSP单独处理请求的时候 Servlet:拼接大量的html字符串 造成可读性差、难以维护JSP:使得html和Java代码互相交织 也造成了可读性差、难以维护的后果 最合适的做法就是两者结合使用 2.ServletJSP处理请…

宿舍管理系统代码详解(主页面)

本篇将对管理系统的主页面的代码进行详细的介绍。 目录 一、主页面前端代码 1.样式展示 2.代码详解 (1)template部分 (2)script部分 (3)路由导航守卫 (4)在vue中引用vue 一、主页…

数据库的三大范式!!!初学者必看

数据库的三大范式!!!初学者必看 三大范式是 Mysql数据库设计表结构所遵循的规范和指导方法目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。 三大范式之间是具有依赖关系的,比如第…

java 并发线程应用

java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…

对关系型数据库管理系统的介绍

1.数据库的相关介绍 关系型数据库管理系统:(英文简称:RDBMS) 为我们提供了一种存储数据的特定格式,所谓的数据格式就是表, 在数据库中一张表就称为是一种关系. 在关系型数据库中表由两部分组成&#xf…

【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库

今天是第七专题,主要内容是:导入ArduinoUZlib功能库,借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据,进行解压缩和t解析,在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容,请…

物联网应用开发--STM32与新大陆云平台通信(云平台控制开发板上蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标:(1)创建5个执行器:蜂鸣器,LED1,LED2,ED3,LED4;(2)执行器能对…

CodeGeeX 智能编程助手 6 项功能升级,在Visual Studio插件市场霸榜2周!

CodeGeeX是支持适配Visual Studio 2019的唯一一款国产智能辅助编程工具,已经在Visual Studio趋势上霸榜2周! CodeGeeX v1.0.4版本上线Visual Studio插件市场,带来了多项新功能和性能优化,提升编程体验。 新功能亮点速览&#xf…

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写,程序结构基本上都是这样的: // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…

Docker 基础认识

文章目录 概念铺垫(1)概念铺垫(2)概念铺垫 (3)概念铺垫(4)Docker 定义Docker 特点Docker 架构 概念铺垫(1) 虚拟化相关概念 物理机:实际的服务器…

【前端】CSS基础(2)

文章目录 前言1、CSS选择器1.1选择器的功能1.2 选择器的种类1.2.1 基础选择器1.2.1.1 标签选择器1.2.1.2 类选择器1.2.1.3 id选择器1.2.1.4 通配符选择器1.2.1.5 伪类选择器 1.2.2 复合选择器1.2.2.1 后代选择器1.2.2.2 子选择器1.2.2.3 并集选择器 前言 这篇博客仅仅是对CSS的…

vue3自定义指令​(通过指令钩子获得dom和钩子参数)

实现文本框自动获得焦点 Index.vue: <script setup> import { ref, onMounted } from vue import ./index.cssconst vFocus {mounted: (el, binding) > {el.focus()console.log(binding)} }onMounted(() > {}) </script><template><div class&qu…

JSPfilters过滤技术

1.创建动态web项目 2.创建filters的文件 3.创建主页面 4.配置xml项目 总结构 主页面代码 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!DOCTYPE html><html><head><meta cha…