目录
- 0 引言
- 1 如何在三角形内进行插值:重心坐标
- 1.1 为什么要在三角形内插值
- 1.2 重心坐标
- 1.3 使用重心坐标做三角形内颜色插值
- 2 应用纹理
- 2.1 简单的纹理映射:漫反射
- 2.2 问题:纹理放大(采用插值解决)
- 2.2 点查询和范围查询
- 点查询
- 范围查询
- 2.3 【扩展】超采样
- 2.4 【拓展】MipMap
- MipMap的原理
- MipMap的优势
- MipMap的缺点
- 应用
- 其他抗锯齿技术
- 2.5 MipMap(PPT的内容)
- 2.6 各项异性过滤
- 各项异性过滤的原理
- 各项异性过滤与MipMap的区别
- 🙋♂️ 作者:海码007
- 📜 专栏:计算机图形学专栏
- 💥 标题:【GAMES101】Lecture08 Shading 3 (Texture Mapping cont.) 纹理映射 续集
- ❣️ 寄语:对知识永远有兴趣!
- 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正
0 引言
本文是博主自己的学习笔记,只是简单的将ppt粘贴过来,有些概念会重新梳理。
1 如何在三角形内进行插值:重心坐标
1.1 为什么要在三角形内插值
因为我们只计算了三角形三个顶点的值,三角形内部的值需要进行插值。
1.2 重心坐标
那A点自己的重心坐标是什么?
那三个参数如何计算?通过面积比计算
三角形的重心在三分之一处,可以分成三个等面积的三角形
1.3 使用重心坐标做三角形内颜色插值
重心坐标(Barycentric coordinates)是在一个给定的凸多边形或者凸多面体中描述点位置的一种方法。这种方法描述了一个点相对于多边形或者多面体顶点的位置,通常表示为三个非负实数的组合,它们的总和等于1。重心坐标在计算机图形学、计算机辅助几何设计、有限元分析等领域有广泛的应用。
重心坐标有很多用途,其中一些主要的包括:
-
几何形状插值和变形:在计算机图形学中,重心坐标可用于描述几何形状的内部点位置,从而实现形状的插值、变形等操作。
-
纹理映射:在计算机图形学中,重心坐标也经常用于纹理映射,即将纹理贴图映射到三角形网格或其他几何形状上。
-
碰撞检测:在游戏开发和物理模拟中,重心坐标可以用于检测物体之间的碰撞或确定物体是否在另一个物体内部。
-
有限元分析:在工程领域,有限元分析中经常使用重心坐标来描述和计算复杂结构中的节点位置,从而进行力学分析。
-
形状识别和分割:在计算机视觉和模式识别中,重心坐标可以用于描述和分割图像中的对象形状。
总的来说,重心坐标是一种非常有用的数学工具,可以用于解决各种几何和计算问题,从而在多个领域中发挥作用。
2 应用纹理
2.1 简单的纹理映射:漫反射
漫反射纹理映射是一种简单而常见的纹理映射技术,它通过将每个三角形顶点的UV坐标与纹理上的像素值进行插值,来计算三角形内每个位置的UV坐标,并最终确定其颜色。下面是一个简单的漫反射纹理映射的过程:
-
顶点UV坐标计算:对于每个三角形,通常会在顶点处指定UV坐标,这些UV坐标指定了纹理上与该顶点相关联的位置。对于内部的点,可以通过插值计算出其UV坐标。这通常是通过重心坐标插值来实现的,其中对于每个内部点,都根据其在三角形内的位置计算出与三个顶点UV坐标的加权平均。
-
纹理采样:一旦计算出了内部点的UV坐标,就可以利用这些坐标在纹理图像上进行采样。通常,纹理采样可以通过在UV坐标处插值来获得像素的颜色值。这通常使用双线性插值或三线性插值来实现,以获得更平滑和精确的纹理映射结果。
-
像素值赋值:最后,将纹理采样得到的像素值赋给相应的位置。这样就完成了漫反射纹理映射的过程。
简单示例代码(伪代码)如下:
for each triangle in mesh:
for each pixel in triangle:
# 计算像素在三角形内的重心坐标
barycentric_coords = calculate_barycentric_coordinates(pixel)
# 根据重心坐标插值计算像素的UV坐标
uv_coords = interpolate_uv_coordinates(barycentric_coords, triangle_uv_coords)
# 在纹理图像上根据UV坐标进行采样
texel_color = sample_texture(texture_image, uv_coords)
# 将采样到的像素颜色赋给像素
set_pixel_color(pixel, texel_color)
这样,就实现了对每个三角形内每个像素的漫反射纹理映射。
2.2 问题:纹理放大(采用插值解决)
纹理放大(Texture Magnification)
高清的影像但是纹理的分辨率很低
Bilinear Interpolation 双线性插值,使用周围的点(4个点)的值,计算出其他点的值。
Bicubic Interpolation 三次插值,使用周围的点(16个点)的值,计算出其他点的值。
前面讨论的都是纹理尺寸太小导致纹理放大后有锯齿。假如现在纹理尺寸过大呢?
点采样纹理存在的问题:
形成这种结果的原因:近处的屏幕像素覆盖的纹理区域小,如下图中左侧所示。远处的屏幕像素覆盖纹理区域大,如右边所示。假如使用覆盖纹理区域像素的平均值来给屏幕像素赋值,就会导致刚才的那种现象。所以这种方法需要改进。
使用超采样解决,如下图所示:缺点计算量太大
如何解决锯齿问题呢?
- 锯齿形成的原因,采样的频率跟不上信号的频率(体现在纹理采样中就是,使用一个采样点对一块9x9大小的纹理进行采样,此时纹理是不断变化的,但是我们只用一个像素点进行采样就会导致锯齿),所以使用超采样的方式可以解决,也就是增加我们采样的频率。但是这样效率太低。
- 那么既然采样会导致锯齿,可不可以不进行采样就立刻知道范围内的平均值是多少呢?可以的,
MipMap技术
2.2 点查询和范围查询
点查询
点查询是指在数据集中查询单个点的值。这种类型的查询通常用于获取特定位置或时间点的确切数据。在图形处理中,点查询可以通过不同的插值方法实现,用于计算或估算某一特定点的属性值,如颜色、亮度等。
- 线性插值:是一种简单的插值方法,用于通过两个已知点的值来估算在这两点之间任意位置的值。线性插值假设两个点之间的变化是均匀的,适用于变化平缓的数据。
- 三次插值:比线性插值提供了更平滑的结果,它通过考虑更多的样本点(通常是四个)来估计目标点的值,能更好地处理数据的曲线变化。
范围查询
范围查询是指查询给定区域或范围内的数据值。这种查询通常用于统计分析、图形渲染中的MipMap技术、GIS中的瓦片加载等场合,其中需要考虑一个区域内所有数据点的信息。
- 在统计分析中,范围查询可能用于计算一个区间内的平均值、最大值或最小值等。
- 在图形渲染中的MipMap技术,范围查询用于选取最适合当前视图距离和尺寸的纹理级别,实际上是从多个纹理样本中选择一个代表值。
- 在GIS应用中,范围查询用于加载用户当前视图范围内的地图瓦片,这些瓦片覆盖了指定的地理区域。
这两种查询方法各有优势和应用场景。点查询适用于需要精确数据或进行精细处理的情况,而范围查询适合于需要考虑区域性特征或进行宏观分析的场景。在实际应用中,根据具体需求灵活选择和结合使用这两种查询方法,可以有效地处理和分析数据。
2.3 【扩展】超采样
超采样抗锯齿(Supersampling Antialiasing,简称SSAA)是一种高质量图形渲染技术,用于改善计算机图形中的视觉效果,减少或消除图像中的锯齿边缘。锯齿通常在边缘不平滑或斜率较大的地方出现,尤其是在3D游戏和图形应用程序中更为常见。
SSAA通过在图像的实际显示分辨率之上使用更高的分辨率渲染图像来工作。这意味着如果你的显示器分辨率是1920x1080,超采样抗锯齿可能会以3840x2160或更高的分辨率渲染图像,然后将其缩小以适应实际的显示分辨率。这种方法可以更精细地平滑边缘,减少锯齿现象,因为在缩小过程中,多个像素被合并成一个像素,自然地模糊了边缘。
-
如何工作
- 渲染阶段:在超过显示器原生分辨率的分辨率上渲染整个场景。例如,对于1080p(1920x1080)的显示器,可能以4K(3840x2160)分辨率渲染场景。
- 降采样阶段:将高分辨率图像缩小至目标显示分辨率。这个过程通过平均多个像素的颜色值来创建单个像素的颜色,从而实现平滑边缘的效果。
-
优点与缺点
- 优点:
- 提供最高质量的图像平滑,可以非常有效地减少锯齿。
- 简单直接,不需要复杂的算法或大量的预处理。
- 缺点:
- 性能成本高:由于需要渲染更多的像素,所以需要更强大的图形处理能力,这可能导致帧率下降。
- 内存消耗大:更高的渲染分辨率需要更多的视频内存。
尽管SSAA提供了优秀的图像质量,但由于其对硬件资源的高需求,它在实际应用中可能不如其他抗锯齿技术(如MSAA(多重采样抗锯齿)或FXAA(快速近似抗锯齿))那样受欢迎。然而,对于追求图像质量至上,并且拥有足够强大硬件的用户来说,SSAA仍然是一个值得考虑的选择。
2.4 【拓展】MipMap
要解决锯齿问题,可以采用几种不同的技术方法,每种方法都有其特点和适用场景。除了超采样(SSAA)以外,MipMap技术也是一种广泛使用的方法,尤其是在处理纹理映射时。下面介绍MipMap技术以及其他一些流行的抗锯齿技术。
MipMap技术是一种用于纹理贴图的优化技术,主要目的是提高图形渲染的效率和质量。其核心思想在于为每个纹理图像创建一系列预计算的、分辨率逐步降低的图像集合(称为MipMap链)。这种技术在三维图形渲染中尤其有用,可以有效地解决纹理贴图中出现的锯齿、摩尔纹(Moire Patterns)和纹理波动等问题。
MipMap的原理
-
创建MipMap链:对于每个纹理,生成一系列的缩小版本,每个级别的纹理尺寸都是前一级别的一半。例如,如果原始纹理大小为256x256像素,则MipMap链中的下一个级别为128x128,然后是64x64,一直到1x1像素。这个过程通常在纹理被加载到显存中时完成。
-
级别选择:渲染时,根据物体表面与摄像机的相对距离和角度,动态选择最合适的MipMap级别进行纹理采样。如果物体远离摄像机或者在视野中较小,使用较低分辨率的纹理;如果物体接近摄像机或较大,使用较高分辨率的纹理。
-
过滤:为了进一步提高纹理贴图的质量,还会使用各种过滤技术(如线性过滤、各向异性过滤)在不同的MipMap级别之间进行插值,以实现更平滑的过渡效果。
MipMap的优势
- 减少混叠和摩尔纹:通过使用与视图距离相匹配的纹理分辨率,可以减少因为纹理采样过度而引起的锯齿和摩尔纹现象。
- 提高渲染效率:使用更小的纹理进行渲染可以减少显存的带宽需求,尤其是在渲染远处物体时,这有助于提升渲染效率。
- 改善性能:减少了对高分辨率纹理的依赖,特别是在视图中只需要较小纹理表示的情况下,可以有效降低图形处理器的负载。
MipMap的缺点
- 占用额外的存储空间:由于需要存储原始纹理的多个缩小版本,所以MipMap技术会占用比单一纹理更多的存储空间。然而,由于每个降级的纹理尺寸减半,整个MipMap链所需的额外空间通常小于原始纹理的50%。
应用
MipMap技术广泛应用于各种图形渲染场景中,包括游戏、模拟、可视化等领域。通过动态选择合适的纹理级别,MipMap技术能够在保持视觉质量的同时,提升渲染效率和性能,尤其适用于对动态场景进行实时渲染的应用。
其他抗锯齿技术
- 多重采样抗锯齿(MSAA):这种技术只对边缘进行超采样,而不是整个屏幕,从而在一定程度上降低了超采样的性能开销。它提供了较好的图像质量与性能之间的平衡。
- 快速近似抗锯齿(FXAA):一种屏幕空间抗锯齿技术,通过分析像素在屏幕空间的亮度梯度来平滑边缘,效率高,对性能的影响较小,但可能会导致图像略微模糊。
- 时域抗锯齿(TAA):通过结合当前帧与前几帧的信息来平滑边缘,可以有效地减少锯齿同时也降低了闪烁,但可能会引入一些运动模糊。
每种技术都有其优势和适用场景。例如,MSAA和SSAA更适合需要高图像质量的应用场景,而FXAA和TAA则在保证一定图像质量的同时提供了更高的性能。在选择抗锯齿技术时,需要根据具体的应用需求和硬件性能进行权衡。
2.5 MipMap(PPT的内容)
Mip 这个词来自拉丁语言,表示很多的小空间
MipMap技术可以被视为一种图像金字塔的实现
如何计算MipMap的级别呢?
2.6 各项异性过滤
各项异性过滤(Anisotropic Filtering, AF)和MipMap是两种提高3D图形纹理质量的技术,它们以不同的方式工作,并且经常被结合使用以获得最佳效果。下面详细解释各项异性过滤的原理,以及它与MipMap的区别。
各项异性过滤的原理
各项异性过滤是一种纹理过滤技术,目的是改善观察角度倾斜(非垂直观察)时纹理的视觉质量。在3D图形中,当表面与视线角度接近平行时,标准的纹理映射方法(如双线性过滤和三线性过滤)往往无法提供足够的细节,导致纹理模糊或拉伸。AF通过在多个方向上采样纹理,考虑了这种观察角度的差异,以此来提高倾斜视角下纹理的清晰度和细节。
AF通过对纹理进行不同方向上的采样并综合这些采样信息来提高纹理质量。这种方法使得即使在极端角度下观察,纹理表面也能保持较高的细节清晰度。AF的效果可以通过设置过滤级别(如2x、4x、8x、16x)来调整,过滤级别越高,采样点越多,纹理质量越好,但相应地也会增加更多的性能开销。
各项异性过滤与MipMap的区别
- 目标差异:MipMap旨在通过使用不同分辨率的纹理级别来优化远距离物体的纹理质量和渲染性能,减少纹理混叠。而各项异性过滤则专注于提高从倾斜角度观察物体时的纹理清晰度,解决纹理模糊和拉伸问题。
- 工作方式:MipMap通过选择与物体视距匹配的纹理级别来工作,而各项异性过滤通过在多个方向上对纹理进行采样并综合这些采样信息来提高倾斜视角下的纹理质量。
- 使用场景:MipMap主要用于处理纹理在不同距离下的显示问题,适用于所有类型的纹理映射。各项异性过滤则主要用于改善特定的视角问题,特别是在表面与视线几乎平行的情况下。
结合使用MipMap和各项异性过滤可以在保持高性能的同时,从不同的距离和角度获得清晰详细的纹理表现。这种组合方法充分利用了两种技术的优势,为3D图形应用提供了丰富和高质量的视觉
解决了矩形的查询,因为MipMap只能使用正方形进行范围查询