GAMES101: Lecture 9: Shading 3(Texture Mapping cont.) ppt笔记

Interpolation Across Triangles: Barycentric Coordinates

三角形上的插值:重心坐标

为什么需要插值法?

三角形的三个顶点有特定的值(颜色,法线,材质...),我们想得到三角形中任意一点的特定值,使得三角形中该值均匀变化

重心坐标Barycentric coordinates (α,β,γ)(\alpha, \beta, \gamma)(α,β,γ)

在三角形中,与三角形共面的任意一点(x,y)(x, y)(x,y)可表示为三个顶点坐标的线性和,即(x,y)=αA+βB+γC(x, y) = \alpha A + \beta B + \gamma C(x,y)=αA+βB+γC

且满足α+β+γ=1\alpha + \beta + \gamma = 1α+β+γ=1

三角形内一点(x,y)(x,y)(x,y)满足重心坐标的三个参数均为非负数

我们将每个顶点的特定值与对应重心坐标相乘并相加 得到三角形内一点的特定值

注意!点在三角形内的重心坐标在投影后可能发生变化

几何上,αβγ\alpha \beta \gammaαβγ的值为顶点对应三角形占三角形ABC的比值

三角形面积由向量的叉积求得,如PA叉乘PB向量的模为三角形PAB面积的两倍

重心坐标结果如下

α=−(x−xB)(yC−yB)+(y−yB)(xC−xB)−(xA−xB)(yC−yB)+(yA−yB)(xC−xB)\alpha = \frac{-(x - x_B)(y_C - y_B) + (y - y_B)(x_C - x_B)}{-(x_A - x_B)(y_C - y_B) + (y_A - y_B)(x_C - x_B)}α=−(xA−xB)(yC−yB)+(yA−yB)(xC−xB)−(x−xB)(yC−yB)+(y−yB)(xC−xB)

β=−(x−xC)(yA−yC)+(y−yC)(xA−xC)−(xB−xC)(yA−yC)+(yB−yC)(xA−xC)\beta = \frac{-(x - x_C)(y_A - y_C) + (y - y_C)(x_A - x_C)}{-(x_B - x_C)(y_A - y_C) + (y_B - y_C)(x_A - x_C)}β=−(xB−xC)(yA−yC)+(yB−yC)(xA−xC)−(x−xC)(yA−yC)+(y−yC)(xA−xC)

γ=1−α−β\gamma = 1 - \alpha - \betaγ=1−α−β

Applying Textures

对屏幕上的每个采样点(x, y) (通常是像素中心)

插值法找到对应的材质坐标(u, v)

将采样点的颜色设为对应材质的颜色

Texture Magnification

当材质分辨率较低,而实际分辨率较大时,会出现纹理放大texture magnification

在采样(x, y)时,常规做法是用最近的texture上的点近似代替,这会导致多个邻近的采样点使用相同的颜色,导致纹理放大

纹理上的像素称为纹理元素texel

双线性插值Bilinear Interpolation 可解决纹理放大

e.g. 双线性插值 取邻近的四个texel,在u, v方向上分别做线性插值

四个黑色texel先在u方向上线性插值得到u1, u0

再做线性插值得到红色采样点的颜色值

(这里的公式假设两个相邻黑色texel的距离为1,便于计算)

Texture Minification

当材质分辨率较大,而实际分辨率较小时,会出现纹理缩小Texture Minification

一个采样点对应到纹理空间上,覆盖范围footprint包括texture上的多个texel

解决方法:Mipmap 实现快速、近似、正方形的 范围查询

将texture提前处理,从level 0原分辨率128x128开始,存储level 1,level 2...level N的图像,图像分辨率边长每次缩小为原本的一半

多消耗原texture三分之一的存储空间

对于每次采样,通过相邻像素在纹理空间中的坐标差来估算footprint的大小

将当前采样点得到的覆盖范围近似为边长为L的正方形

通过边长L找到在mipmap中对应的level D ,即D=log2LD = log_2LD=log2L,然后使用对应level D的提前处理的texture进行着色

如果处理出来的level D不是整数呢?

采用三重线性插值Trilinear Interpolation

先在与D相邻的两等级的texture上,对采样点周围四个texel使用双线性插值

再将两个结果按D的小数结果进行线性插值

floor(D) + ceil(D) --------linear interpolation--------> D

mipmap的限制:各向同性带来的倾斜,长条形footprint,会导致overblur

解决方法:各向异性过滤Anisotropic Filtering

提前处理texture时,对于mipmap的每个等级的图像,固定图像分辨率长度不变,宽度为原来的一半,1/4...;宽度不变,长度为原来的一半,1/4...

这样在查询时可以得到轴对齐的矩形区域

对采样点近似时,部分矩形覆盖范围不必近似成大型正方形,而能直接查询到对应的矩形

但各向异性过滤对于倾斜的矩形覆盖范围的采样点优化仍然有限

可采用EWA filtering:多次查询,加权平均,可处理不规则覆盖范围

相关推荐
zhangrelay31 分钟前
《机器人控制器设计与编程》课程习题资料-2026
linux·笔记·学习·ubuntu
志尊宝40 分钟前
Vue3 零基础每日笔记(055):组件里正确使用 store——storeToRefs 解构与 $patch 批量修改
笔记·vue·html·前端开发·软件开发
kkkkkkkkkk_Z1 小时前
新手自学嵌入式|学习日记:从C语言到51单片机基础(GPIO、中断、定时器与PWM篇)
linux·笔记·学习·51单片机
陈年老古董1 小时前
微博情感分析项目学习笔记
笔记·python·学习·机器学习·项目
2601_960631231 小时前
如何用公开数据接口查询制药企业资质信息
笔记
小刘在重生~1 小时前
Oracle_day2 单行函数|组函数|分组|伪列|子查询|分页|多表连接
笔记·oracle·面试
AAA代码批发商3 小时前
Days 47 IMX6ULL 裸机开发:按键轮询实验 + 外部中断原理剖析(上)
笔记·学习·imx6ull·裸机开发·#arm中断
sunoo-2293 小时前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
景煜拾年3 小时前
RHCA-Docker知识点整理
运维·笔记
M78佐菲11 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习