1.5 纹理

news2024/10/6 18:25:14

这次笔记时间有点久,主要是这节课讲的东西需要很多基础来铺垫,看完了后感觉缺失信息很多,又去补了GAMES 101 3~10节内容。 强烈建议看不懂的先去学习GMAES101 网址Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)_哔哩哔哩_bilibili

纹理

 

宏观的角度上来说就是一张2D图片,一个像素上有 RGB 值。

为什么要有纹理

纹理的出现

    • 减少建模工作量 <=>牺牲几何细节
    • 减少存储空间
    • 增加读取速度

如果一个模型我们要把所有的细节都表现出来,那无疑是一个巨大工作量,对于简单的模型还好说,但是当我们把工作转换到人体模型上面,人体结构的复杂,外加服装可能各式各样,花式不同,这无疑增大了建模师的工作量。

但是我们如果将一个纹理贴到这些模型上,能保证模拟物体表面的技术没有太大变化,在省略了很多细节之后,也能大致还原原来的表现形式

纹理管线

纹理管线是将纹理映射到屏幕像素上的过程。

模型空间位置→投影函数→纹理映射→纹理坐标→通讯函数→新纹理坐标→纹理采样(避免依赖纹理读取)→纹理值。

投影函数:这里与摄像机投影不同,这里是指展UV的技术

依赖纹理读取:也就是只要不是顶点着色器传过来的纹理采样数据,在片元着色器需要计算 UV 偏移,哪怕只是进行了一些计算,也会严重影响性能表现,所以我们需要把 UV 偏移等这些计算放在顶点着色器中计算

纹理采样设置

Wrap Mode

决定 UV 值在[0,1]以外的表现

OpenGL -- "包装模式"(Wrapping Model)

DirectX -- "纹理寻址模式"(Texture Addressing Mode)

Repeat —— 重复

Mirror —— 镜像

Clamp —— 这个图形的边界

Border —— 当超过这个范围的其他位置的颜色需要设置

Filter Model

过滤设置,当纹理通过变化产生拉伸的时候,要使用哪种滤波来进行纹理的表现。


-------后续参考GAMES 101 09---------


为何有纹理

假设有两个光源打到球上,这个球上面有不同的颜色,也就是说kd的值不同,我们希望能用一种方式来定义这个球上的每一个顶点的属性(纹理坐标、颜色、法线向量等等)。

因此引入纹理。

纹理

纹理可以理解为时覆盖在物体表面的一层布,布上面有着图像,将布放平则得到一个2D图片(Texture)。

所以我们可以认为任何物体表面的图像,都可以撕下来,展开成一张2D图片。同时,图片上的每个点也都能对应上物体上的位置。

纹理映射于物体表面

上图所示,空间中的三角面对应纹理中三角形的位置关系

纹理贴图有着自己的纹理坐标,我们一般默认将纹理贴图展开后x轴为u,y轴为v,(在纹理坐标中越往u方向默认颜色为红色,v方向默认为绿色)。

纹理贴图也是我们经常提到的uv图

正常uv图展示

渲染好的场景

显示UV坐标下的场景

纹理采样

可以理解为将纹理上的点对应上空间中每一个点。

重心坐标

当由于模型都是由三角面构成,而我们开始拿到的数据是顶点数据,这时我们需要对三角形内部进行插值运算让每个点都平滑过渡,从而得到好的画面效果。

如何进行平滑过渡,则需要用到重心坐标。

假设点(x,y)是△ABC的重心坐标,则有:

    • (x,y) = αA+βB+γC
    • α+β+γ = 1 结论:限制重心点在ABC所在平面内(为何等于1,因为解释起来复杂,视频未解释)
    • (x,y)点在三角形内部,即(α>0 β>0 γ>0)或者(α<0 β<0 γ<0)。

同时满足上面三个条件,则认为(x,y)为△ABC的重心坐标。

由上图可知,AA、AB、AC三角形的面积,分别比上大三角形ABC的面积,得到的比值分别为 α、β、γ 。

(此处α、β、γ为何与第一个特性的α、β、γ对应上,可以参考下方链接有详细的证明步骤)

由此可得,图右公式

根据前两个特性,可得如图所示公式。

最终可得V点坐标,又如开头所说,顶点可以代表任意属性,位置、纹理坐标、颜色、法线、深度、材质等等。

更具体的重心坐标算法可以参考:重心坐标(Barycentric coordinates) - 知乎

但是要注意,这时候三角形已经投影到屏幕上了,尤其对于在三维空间中的属性(比如深度信息),应该找到像素中心点对应三角形的位置的三维空间坐标,然后在三维空间中将A、B、C的深度(属性)插值好,再放回来。这个过程需要做一次逆变换就可以了。





 

由于空间中的任意三角形顶点都是已知的,上面又可以求出三角形内部的重心坐标。因此我们可以通过差值求出世界空间中三角形内任意一点,然后就可以通过纹理坐标(UV坐标)查询到对应纹理的UV值,这样就可以拿来用了(例如最开始提到的Kd)。

采样方式

当一张图片的大小小于屏幕像素时,就会发生图片的拉伸,导致图片模糊。

纹理上的纹素、纹理元素(texel)无法一一对应上屏幕上的像素,像素个数>纹素个数,导致在采样时形成类似于马赛克的块状区域。如下图所示。

为应对上述问题,采用以下方法

临近点采样(Nearest)

顾名思义,直接采样里当前像素对应uv坐标中最近的纹素。

优点:速度非常快。

缺点:当纹素个数<像素个数时会产生方块,类似马赛克效果。

双线性差值(Bilinear Interpolation)

红点为像素,黑点黑框代表纹理。

目的:球红点处对应的纹理属性。

选取当前红点周围四个纹素区域。

此时得到u0(u01与u11的差值),u1(u00与u10的差值)。

再计算u0与u1的差值来得到最终红点的数值,即周围四个区域的差值。

每一个像素点都依次求值最终得到的数值就是Blinear后的结果。

优点:速度快

缺点:最终采样略有瑕疵。

Bicubic

相较于双线性插值算法采样周围四个点,Bicubic则是采样周围16个点。

优点:得到的图片效果相比于前两个最佳。

缺点:相比于前两个速度最慢。

问题与优化

摩尔纹

当一张纹理大小过大大于屏幕像素时就会出现摩尔纹。

原因是因为远处的图像变小,导致一个像素会覆盖对应uv图中一个大的区域,如果按照点采样的话,周围覆盖的纹素信息就会丢失,导致画面信息缺失,出现摩尔纹的情况。

一个简单粗暴的办法就是进行超采样处理,譬如上图右边进行512次的采样,这样就会一定程度上保证画面完整性。

优点:画面最好。

缺点:消耗过大,无法在手机上使用,PC上消耗也很大。

Mipmap

Mipmap的范围查询三个特点:快(查询速度非常快)、大约(是查询的近似值)、方形(查询区域仅可以是方形)。

Mipmap就是将原图片进行等比缩放,每次缩放为原来的2的n次幂,如上图所示。

最终得到的Mipmap图,比原图多了1/3大小。

先要算出当前像素所用的Mipmap等级(D),就要计算出当前区域内像素对应uv坐标里的数值,然后根据计算得到的数值,来选择使用哪个等级的Mipmap。

一个三角形中两个相邻的像素点预估覆盖的区域,在UV坐标中分别对应的点,如上图所示。

以红色的像素点为例,计算出相邻两个像素点在对应UV坐标下的距离L。式子中的dx应该是采用了微分的思想算的。

求得的L当做当前纹理上的长度,又因为默认长度为1(单位长度),所以采取D的等级是

如果这个正方形区域就是1×1,那么就表明一个像素正好对应一个边长为L的正方形区域,也就可以直接在最 原始(第0层,D=0)的纹理上找对应的像素,就是它的值。

如歌这个正方形区域是2×2,那么这个区域会在第1层(D=1)上对应一个像素

如果这个正方形区域是4×4,那么这个区域会在第2层(D=2)上对应一个像素

对于L×L大小的正方形,一定会在D=log2L层上对应到一个像素。

因此我们只需要算出D,即在第几层正方形的区域对应一个像素,就可以得出这个区域内平均值是多少。

将这个分层的过程可视化,如上图所示。

但是会发现,两层之间有很明显的边界,那么在实际纹理映射的过程中可能会出现一些缝。

在此处我们的解决方法是,先找D层,再找D+1层,这两层内部分别用双线性插值把对应的在这两层上的查询做出来,做出来之后把这两个双线性插值的值合到一起,然后在层与层之间再做一次插值。总共做了三步插值,在双线性插值上又加了一步插值,这就是三线性插值。这样我就可以在任意层,无论是整数层还是浮点数层(例如第1.8层,D=1.8)。

各向异性(Anisotropic Filtering)

三线性插值后得到的结果,相较于超采样出来图像,发现在远处的图像全都重叠在了一起。这是因为三线性插值是按照一个方格一个方格来计算的,当碰到斜着的纹理时就无法很好处理这种情况。

这时就需要用到另一种方式来处理纹理——各向异性(Anisotropic Filtering)

这种方式生成的图片考虑到了图片斜着的情况,即对角线图片,如上图所示。同时图片的大小是原来图片的3倍。

EWA Filtering

人们发明了另外一些方法,如EWA,对于任何一个形状,都可以拆成很多不同的圆形去覆盖这个形状。如上图查询一个椭圆,将其拆成三个圆形,每次去查询一个圆形,多次查询自然就可以得到一个区域,但是代价是“多次查询”。可见质量越高的效果,性能开销越大。

环境贴图

将环境信息放到贴图上,然后采样到物体上得到物体在场景中的环境信息。

球形环境贴图。

球形贴图的问题

将球形贴图展开来看图片的上方和下方都有明显的扭曲。

CubeMap

如何解决球形贴图的问题。

将球想象它在一个立方体内,然后将球表面的纹理信息映射到立方体表面,这样就得到了cubemap。

CubeMap展开后的样子。

法线贴图

用来模拟物体顶点位置的法线。

p为原本顶点位置,n为经过法线贴图变换的p点的位置,此时p点的法线和n点的法线已经不同。

2D空间中,求n点法线。

我们认为,某点p原来的法线n为(0, 1) ,我们要求出改变后的法线,首先就要求出切线,设切向量为(x,y)

由于点p内存储着这一点的高度信息,因此会改变p点的高度,为h(p),利用微分的思想,我们再去找相邻像素点的位置,即p+1处,也有一个高度h(p+1),通过这两点的高度差,就可以算出切向量的y值,即为dp,x的值就是相邻两个像素的x,为1,因此切向量即为(1,dp),所以法向量就是(-dp,1),即法线为(-dp,1)。

3D空间下求得的法线为

位移贴图(置换贴图)

法线贴图只是模拟物体表面顶点的法线方向,而位移贴图则是实际的改变了物体表面顶点的位置。

噪声图

还可以定义三维纹理,如果把这个球砍一半,可以看到其内部的纹理,这里实际定义了空间中任何一点的值,这种纹理实际没有真的生成纹理的图片,而是定义了一个在三维空间中的噪声函数,对于空间中任意一点都有一个解析式可以算出在该点的值。

环境光遮蔽图、AO图(Ambient Occlusion)

模拟模型被光照后自身所产生的的阴影效果。

3D Textures and Volume Rendering

体渲染中,用3D纹理可以存储物体的密度等。

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

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

相关文章

你知道哪些Linux 发行版采用 了KDE Plasma 吗

Linux操作系统以其高度的灵活性和可定制性而闻名&#xff0c;有许多不同的发行版适用于各种场合和需求。其中一种备受欢迎的桌面环境是KDE Plasma&#xff0c;它提供了现代化的外观、丰富的功能和高度自定义的选项。那么&#xff0c;你知道哪些Linux发行版采用了KDE Plasma呢&a…

python遍历整个网站寻找所有输入框并提交表单

文章目录 一、遍历查找网站所有输入框二、对找到的输入框实现自动表单提交三、实现留言板和其他输入框的表单提交 一、遍历查找网站所有输入框 # 查找所有表单 import requests from bs4 import BeautifulSoup import sys# 定义起始页面 url sys.argv[1]# 通过requests库获取…

Linux下如何部署Nuxt项目(二)

Linux下如何部署Nuxt项目(一)_小鸟哗啦啦的博客-CSDN博客&#xff0c;书接上回&#xff0c;以实际场景开始。 请认真看完这篇文章&#xff0c;还不会部署Nuxt&#xff0c;我直接拿弹弓打你们家玻璃&#xff01; 一、nuxt的配置检查 服务端渲染的应用&#xff0c;应该是先编译构…

智能手表学习笔记

一、相关知识模块 1、RTOS & FreeRTOS &#xff08;1&#xff09; RTOS 实时操作系统&#xff08;Real Time Operating System&#xff09; 是指当外界事件或数据产生时&#xff0c;能够接受并以足够快的速度予以处理&#xff0c;其处理的结果又能在规定的时间之内来控制…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(二):损耗的来源

导体电阻和趋肤深度 信号沿信号路径和返回路径传播的串联电阻与导体的体电阻率和电流传播的横截面有关。直流时&#xff0c;信号导体中的电流分布均匀&#xff0c;电阻为&#xff1a; ρ表示电阻的体电阻率&#xff0c;w表示线宽&#xff0c;t表示导体厚度&#xff0c;Len表示走…

7.10蓝桥杯刷题

public class _求阶乘和 {public static void main(String[] args) {// 根据已有的知识 可以知道的是&#xff0c;现在要求s的末尾九位数字&#xff0c;已知的是39之后的阶乘他的后九位都是0;//所以不需要计算到2023的阶乘//一个数求出来的阶乘想要末尾有0//数中必须要有2和5&a…

C语言每日一练(3)

C 练习实例6 题目&#xff1a;用*号输出字母C的图案。 程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 程序源代码&#xff1a; #include "stdio.h" int main() {printf("用 * 号输出字母 C!\n");printf(" ****\n")…

小红书数据分析工具|年轻人入玄门?小红书热门笔记大赏

当代年轻人血脉觉醒&#xff0c;逐渐出现寺庙打卡、电子木鱼、发疯语录“在上进和上班之间&#xff0c;选择上香”&#xff0c;小编观察近期彩票成为年轻人信仰的新玄学&#xff0c;兴起了“送礼就送刮刮乐”的小风潮。卷不动躺不平的年轻人&#xff0c;严重精神内耗下&#xf…

Pycharm中设置动态模板(自定义自动补齐)

Settings——Editor——Live Template——点击号新增动态模板 Abbreviation缩略词&#xff1a;输入的简写内容 Template text: 简写词对应的模板内容 默认输入简写内容按Tab键&#xff0c;生成模板内容 Define: 选择在哪个语言环境下生效

【WebSocket】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 需求分析和设计4.2 代码开发4.3 功能测试 5. 客户催单5.1 需求分析和设计5.2 代…

接口自动化测试,一键快速校验接口返回值全部字段

目录 前言&#xff1a; 一、认识一下&#xff0c;DeepDiff 介绍 主要组成部分&#xff1a; 二、DeepDiff 使用 2.1 案例一&#xff1a;比较两个 JSON 2.2 案例二&#xff1a;比较接口响应 2.3 案例三&#xff1a;正则搜索匹配 三、最后一个小技巧&#xff1a;DeepDiff …

【代码随想录 | Leetcode | 第二天】数组 | 双指针法 | 相向双指针 | 27

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来双指针法和相向双指针的分享✨ 目录 前言27. 移除元素 27. 移除元素 ✨题目链接点这里 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于val的元素&#xff0c;并返回…

keep-alive和router-view配合使用缓存整个路由页面以及路由切换

实现内容&#xff1a;通过vue实现&#xff0c;在页面有侧边栏动态来展示当前页面流程&#xff0c;右边进行页面的切换&#xff0c;左右两边都是组件&#xff0c;但是A/B/C组件的切换是通过keep-alive搭配router-view实现的&#xff0c;首先在当前文件中创建五个文件&#xff1a…

Linux系统编程(传统信号和实时信号)

文章目录 前言一、传统信号和实时信号概念二、重要函数介绍三、实时信号和传统信号被处理的次数总结 前言 本篇文章我们来讲解传统信号和实时信号&#xff0c;这里我们将从实际应用给大家讲解。 一、传统信号和实时信号概念 传统信号&#xff08;Traditional Signals&#x…

spring boot学习第一篇:spring boot 1.5.x版本启动接口服务

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

华为云出品《IDEA-Plugin-开发手册》电子书——学完即会场景设计

小智又来给各位开发者送书啦&#xff01; 助力各位开发者们提升技能 海量案例串联 IEDA Plugin 插件开发技能 重实践与验证帮助避免踩坑 学完就可自己完成一些场景设计和开发 适合有一定编程基础&#xff0c;1年以上经验的开发者 适合对IDEA Plugin有学习需求或想拓展业务…

出海企业系列风险分析--网站需要验证码吗?

最近接待了几位从discuz来的用户&#xff0c;说是想要给自己海外的网站安装验证码&#xff0c;但是discuz境外服务器还要解析安装中心的DNS到境外服务器上&#xff0c;所以基于discuz建站的不好之处就在这里。 而且我们还讨论到一个问题&#xff0c;海外的网站&#xff0c;需要…

【线程概念和线程控制】

目录 1 :peach:线程概念 :peach:1.1 :apple:什么是线程&#xff1f;:apple:1.2 :apple:线程的优点和缺点:apple:1.3 :apple:页表的大小:apple:1.4 :apple:线程异常和用途:apple:1.5 :apple:进程VS线程:apple: 2 :peach:线程控制:peach:2.1 :apple:POSIX线程库:apple:2.2 :apple…

tp6的runtime/Logs目录下产生大量日记文件,怎么取消自动生成?

一开始查了好多网上提供的&#xff0c;很幸运都是抄袭别人的&#xff0c;没一个成功&#xff0c;最后无奈只能自己解决方法 其实很简单&#xff0c;不用修改config/log.php文件&#xff0c;没用因为只要有登入错误&#xff0c;警告&#xff0c;消息或者sql错误都会写入 解决方…

windows编译poco c++库

背景 最近有了解到poco c库&#xff0c;这里记录下编译及使用过程。 最开始使用的vs studio 2022 和 poco 1.12.4版本编译&#xff0c;不管openssl 使用哪种版本&#xff0c;都会编译报错&#xff0c;最后妥协了。 参考&#xff1a;https://www.bilibili.com/read/cv1416565…