计算机图形学-GAMES101-9

前言

  • 材质和光的相互作用很重要。
  • VertexShader和FragmentShader。
  • 纹理贴图Texture mapping。

一、在三角形中插值

  • 为什么要在三角形内部插值?虽然我们的操作很多是在三角形顶点上进行计算的,但是对于三角形内部我们也希望每个像素点能得到一个值,以此实现一个平滑的过渡。
  • 我们要插值什么内容?可以插值的内容很多,比如颜色、纹理坐标、法向量。颜色插值使得三角形内部不至于全黑,并且插值使得颜色有一个自然平滑的过渡。纹理坐标插值使得三角形内部每个像素点也能具有自己的纹理。法向量插值使得在Phong模型中我们可以计算三角形内部每个像素的颜色。
  • 插值可以对三角形顶点的任意属性进行。

重心坐标

  • 对于任意三角形ABC,如果存在一点D位于三角形ABC所处平面内,那么我们就可以把D(x,y)表示成三角形三个顶点坐标的线性组合,且三个系数之和为1。如果三个系数都非负,那么这个点比如在三角形内部。
    在这里插入图片描述

  • 根据上述内容,我们可以使用重心坐标(aef,bet,gama)来表示三角形内部任意一个顶点。条件:aef、bet、gama>0,(x,y)=aefA+betB+gama*C,aef+bet+gama=1。

  • 三角形内部的点也包括三个顶点:
    在这里插入图片描述

  • 通过面积比计算重心坐标
    在这里插入图片描述

  • 三角形重心的计算
    在这里插入图片描述

  • 像素点属性的插值(先算出重心坐标,再用重心坐标插值)
    在这里插入图片描述

  • 投影之后点的重心坐标会发生改变,而实际情况发生在三维空间中,因此我们应该在三维空间中对像素点进行插值。比如在光栅化时,每一个像素都要比较覆盖了它的三角形的片段的深度,以此来进行深度测试。而很多像素都不是顶点,它们的深度信息从何而来?当然是插值,也就是用重心坐标表示,而这时都已经映射到二维平面空间了,怎么办?当然是对三角形顶点坐标进行逆变换,变换回三维空间中,然后计算重心坐标,最后在投影空间中插值出像素点的深度值。(要注意深度测试不是在世界坐标系中)

二、应用纹理

  • 基于插值我们得到每个像素的纹理坐标,根据纹理坐标我们可以获取到像素的属性,这种属性可以是颜色、漫反射系数、镜面反射系数、法向量。
    在这里插入图片描述

三、Texture Magnification

(1)纹理较小

 如果纹理分辨率较小,应用到较大分辨率的平面上,会发生什么呢?

1.1 Nearest

 当纹理放大时,也就是说纹理的分辨率不变,其中包含的像素点数目不变。但是纹理放大要贴到一个更大的物体上,导致纹理包含了更多的屏幕像素点,这些屏幕像素点太多了,采样就会出现像我的世界一样的效果,观察下图:
在这里插入图片描述
 Nearset是一种纹理的过滤方式,它表示当屏幕上的像素点插值出来的纹理坐标为(x,y)时,找到纹理贴图中与(x,y)距离最近的像素点,把贴图中像素点的属性赋值给屏幕像素点。当纹理放大后,很可能纹理贴图中的像素点数目已经远小于屏幕像素点了,这将导致4、5、6甚至多个屏幕像素点匹配到一个纹理像素点。如果是采样颜色的化,如上图最左边所示,就会出现像素方风方格。这是由于多个相邻屏幕像素点采样到一个颜色值,一模一样的像素点就组成了一块块的像素风方格。

1.2 Bicubic

 看起来Bilinear和Bicubic过滤方式实现的效果比Nearest好得多,那么我们如何实现Bilinear呢?我们根据像素的纹理坐标,找到它四周的纹理像素点,根据纹理坐标到纹理像素点之间水平和竖直的相对距离进行插值。插值计算过程如下图所示。如果纹理坐标位于四个点正中间,那么插值的属性值就等于四个点属性值的平均。这就是双线性插值(竖直和水平顺序任意)。
在这里插入图片描述
 选取周围16个像素点进行竖直和水平插值,每次用4个做三次的插值,而非线性插值。运算量会增大,但是带来的效果较好。

(2)纹理较大

 如果纹理分辨率较大,应用到较小分辨率的平面上,会发生什么呢?

走样

 对下图中左边图像中的地板应用纹理,结果就是出现下图右边的情况:近处出现锯齿、远处出现摩尔纹。
在这里插入图片描述
 由近及远,屏幕上一个像素所覆盖的纹理区域会越来越大,当到达地平线时,一个像素覆盖一大块的纹理区域。而我们要想采集这个像素的颜色值,我们会使用它的中心坐标进行采样,将一大块纹理区域的平均颜色值赋值给这个像素。
在这里插入图片描述
 使用超采样技术进行反走样,如下图能得到一个较好的结果,但是会大幅增加算法的时间。
在这里插入图片描述
 问题分析:当在远处时,一个像素点内部包含了一大块纹理区域,这一大块纹理区内颜色的变化是很快的,而我们只使用一个采样点区采样它,因此我们得到的颜色值是不足以代表这一整块区域的,也因此我们的采样频率远低于信号的频率,就会发生走样。当我们对每个像素内添加512个采样点时,我们增加了采样频率,我们以512个采样点采取到的平均颜色值作为像素点的颜色值即可正常采样(较高频率的使用了一大块纹理信息)。但是如果我们不想有这么大的开销呢?
 如果我们能知道任何一个纹理区域内所有纹素的平均颜色值不就好了?这采样效率和一个采样点一样,而且查到的精度可能比512个采样点还高。这涉及范围查询,它保证可以查询任意大小区域。

四、 Mipmap

 可以做近似的、正方形的范围查询,它的特点:

  • fast快
  • approx有误差
  • square正方形
     Mipmap其实就是一张图生成一系列图。当我们有一张纹理时,我们先生成纹理的所有Mipmap,过程如下图所示:
    在这里插入图片描述
     现在有了Mipmap,当纹理矩阵很远相对于像素的分辨率很高时,我们直接采样对应Mipmap纹理即可。那么我们如何知道采样第几层的Mipmap呢?
    在这里插入图片描述
     如上图所示,我们找到像素点上下左右四个邻近像素点,然后计算像素点纹理坐标和临近像素点纹理坐标的距离的最大值,我们定义它为L。当L为1时,我们直接采样原纹理图片即第0层纹理可;当L=2时,像素方格内包含了两个纹理点,因此我们使用预先生成的第1层纹理即可。第1层纹理已经将纹理中每两个颜色值做了平均,因此我们可以直接查询。易知,我们使用D=log2L层纹理采样像素中心点的纹理坐标即可。效果如下图所示:
    在这里插入图片描述
     可以看到,当我们使用整数层级时走样已经消失了,但随之而来一个问题,那就是纹理颜色变换的不连续,这是因为当距离一远就会使层级D+1或者D-1,我们直接换了一个分辨率更高或者更低的纹理区采样,导致颜色没有渐变和不连续,这该怎么解决呢?我们发现层级的变换不是连续的,因为我们的层级是整数。如果我们想要将D=1.8层显示出它自己的效果,即我们不想让它和D=2.4使用一样Mipmap,那该怎么办呢?
    在这里插入图片描述
     同样是进行插值,诸如上图,我们先在D=1层对像素纹理坐标进行双线性插值,采样出D=1层的纹理颜色。然后我们在D=2层也同样对像素纹理坐标进行双线性插值,得到D=2层的纹理坐标。然后我们再对D=1和D=2层采样到的纹理颜色进行插值,这三步插值(双线性插值+线性插值)我们叫它三线性插值。
     到现在,当纹理分辨率过低时,不管纹理坐标是小数还是整数,我们都可以使用双线性插值获得一个连续的纹理颜色。当纹理分辨率过大时,不管算出来的D层级是不是整数,我们都可以使用三线性插值出一个连续的纹理颜色。这样无论是远还是近,无论分辨率高还是低,我们都会获得采样到连续变化的颜色,即不会再走样了。效果如下所示:
    在这里插入图片描述
     当我们将插值的Mipmap用在地板上时,又发生了一些问题,如下图所示,可以看到远处的像素点都被模糊了。
    在这里插入图片描述
     各向异性过滤。Mipmap就是把一种原始的图不断缩小,每次长宽各缩小一半。
    在这里插入图片描述
     Mipmap对纹理的压缩是图中对角线形式的,即在长和宽上实现均匀压缩。因此在上文中我们使用Mipmap时是讲纹理坐标覆盖的一块区域映射回了原图的一块矩形区域,但我们会发现很多纹理覆盖的区域都不是矩阵的,如下图所示:
    在这里插入图片描述
     如上图所示,可以看到很多纹理对于的纹理区域都不是矩形的,当我们使用方格矩阵Mipmap时,我们的方格会扩住一个更大的区域,即我们求的不是精确的覆盖的纹理区域,而是能覆盖它的一个大方格,因此这个平均会很模糊。当我们引入各向异性过滤时,我们不用受限于一个正方形区域,可以使用一个矩形即长宽不等比的区域区查询。看上个图,也可以看到各向异性过滤代价是Mipmap的三倍。EWA可以描述不等比的形状,但是会多次查询。各向异性使用更多的显存空间,但其实影响不大。

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

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

相关文章

ChatGPT的兴起的时代,国内chatgpt产品大盘点

在人工智能技术的不断发展和应用下,自然语言处理技术成为了研究的热点之一。而其中最受关注的就是“聊天机器人”技术,而GPT(Generative Pre-trained Transformer)模型则是目前最流行的聊天机器人生成模型之一。 随着 ChatGPT 技…

模板类与友元

目录 分类 一、非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数; 代码 分析 运行结果 二、约束模板友元:模板类实例化时,每个实例化的类对应一个友元函数;并且这个模板友元适用多种类模…

pg事务:事务ID

事务ID pg中每个事务都会分配事务ID,事务ID分为虚拟事务ID和持久化事务ID(transactionID)。pg的事务ID非常重要,是理解事务、数据可见性、事务ID回卷等等的重要知识点。 虚拟事务ID 只读事务不会分配事务ID,事务ID是…

Chrome Performance 页面性能分析

Chrome Performance 页面性能分析 背景介绍 性能优化是前端开发一个非常重要的组成部分,如何更好地进行网络传输,如何优化浏览器渲染过程,来定位项目中存在的问题。Chrome DevTools给我们提供了2种常用方式 Audits和Performance&#xff0c…

三分钟看懂JDK、JRE和JVM的区别和联系

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) JVM Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同…

【C++】21年精通C++之泛型编程和模板初阶知识

❤️前言 大家好!今天和大家一起学习关于C泛型编程和模板初阶的相关知识。 正文 我们之前已经学习了C中非常重要的一个特性——函数重载,函数重载很好地提高了我们代码的可读性。但是对于适配多种参数的某种函数来说,我们如果使用函数重载就…

Maven安装和配置(详细版)

Maven安装和配置 Maven安装1、安装链接:2、配置环境变量: Maven配置1、修改Maven仓库下载镜像及修改仓库位置:2、在Idea上配置Maven: 测试Maven安装能否安装jar包 Maven安装 1、安装链接: Maven – Download Apache …

阿里云服务器 之 mqtt服务器搭建及使用

本文主要是对mqtt的学习使用,其中服务器是基于阿里云服务器的mqtt功能,客户端使用的是mqttx软件。 一、服务器部分搭建说明 1、如果是首次使用,则需要经过注册与认证的步骤。 2、找到"产品与服务"-->"物联网平台"&…

【MySQL】多表查询

上一篇介绍了外键约束,外键约束是用于连接两张数据表的,所以在此基础上就有了多表查询 之前的查询都是单表查询,这里我们会将多个数据表的数据结果返回在一张表上 文章目录 1.多表关系2.多表查询2.1 多表查询分类2.2 内连接2.3 外连接2.4 自连接2.5 联合查询2.6子查询 1.多表关…

微信小程序nodejs+vue+uniapp超市网上购物商城系统

超市购物系统用户端要求在系统的安卓手机上可以运行,主要实现了管理端;首页、个人中心、用户管理、商品分类管理、商品信息管理、商品入库管理、订单信息管理、订单配送管理、订单评价管理、退货申请管理、换货申请管理、系统管理,用户端&…

【大数据学习篇7】小试牛刀统计并且分析天猫数据

本项目基于搭建大数据环境,通过将数据存放在HDFS上,从HDFS中获取数据,然后根据实际需求通过Spark或Spark SQL对数据进行读取分析,将分析结果存储到HBase表中,最终通过 ECharts数据可视化工具基于Python Web平台实现数据…

docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

一、前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事…

看模型、做技术交底、做项目汇报,图新说数字化汇报平台引领交互式汇报新模式

现场汇报效果不好,导致丢了一个项目! 项目汇报平淡无奇,方案屡次被毙! 面对专家质疑,回答苍白无力! 估计大家都有过这种经历和感受。 详细分析一下,基本上有以下几个方面的原因: …

虚幻or现实?堆区、栈区真实存在吗?是操作系统在骗你罢了...

文章目录 💐专栏导读💐文章导读🐧引例 🐦进程地址空间🐦虚拟地址与物理内存的联系🔔回答引例中的问题🔓写时拷贝 🐦虚拟地址存在的意义🔓malloc的本质 💐专栏…

装饰者设计模式解读

问题引进 星巴克咖啡订单项目(咖啡馆): 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 2) 调料:Milk、Soy(豆浆)、Chocolate 3) 要求在扩展新的咖啡种类时&#x…

接口测试全流程扫盲,让我看看有哪些漏网之鱼

目录 扫盲内容: 1.什么是接口? 2.接口都有哪些类型? 3.接口的本质及其工作原理是什么? 4.什么是接口测试? 5.问什么要做接口测试? 6.怎样做接口测试? 7.接口测测试点是什么?…

一些云原生开源安全工具介绍

本博客地址:https://security.blog.csdn.net/article/details/130789465 一、Kubernetes安全监测工具kube-bench kube-bench是一个用Golang开发的、由Aqua Security发布的自动化Kubernetes基准测试工具,它运行CIS Kubernetes基准中的测试项目。这些测试…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 (一)索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构,这些数据结构以某…

用WaveNet预测(Adapted Google WaveNet-Time Series Forecasting)

目录 剧情简介: 数据来源 加载数据 分割数据和可视化 时间序列的多元波网模型:实现(多步预测) 创建模型 创建数据集 数据准备 1- Training dataset preparation 2- Validation dataset preparation Train the Model with TPU: 使用经过训练的适应Google WaveNet预测…

YOLO NAS note 1

Git Hub: https://github.com/Deci-AI/super-gradients Yolo-Nas 的代码比YOLO v8 还恐怖。之前的YOLO数据可以通过: coco_detection_yolo_format_train, 和 coco_detection_yolo_format_val 自动转。 这里写目录标题 Train数据获取数据增强训练criteri…