虚拟纹理与几何图像技术

一. 基本图形学概念

图1. 几何与纹理。

曲面一般表示成三角网格和纹理图像,三角网格表示曲面的几何拓扑信息,纹理图像给出曲面的颜色材质等信息。将三角网格映射到平面区域的过程被称为曲面参数化,将纹理图像贴合到曲面上被称为纹理贴图。图1显示了一张人脸曲面的三角网格、纹理图像;图2是图1数据的渲染结果。

图2. 几何加纹理渲染效果。

为了提高实时渲染速度,减小内存存储要求,为同一个几何模型准备了不同解析率的三角网格,根据细节层次(Level
of Details)要求来决定所用的解析率。如图3所示,如果几何体距离镜头很远,用低解析率的模型;反之,如果曲面距离镜头很近,用高解析率的模型。不同LOD的三角网格可以采用同样的纹理图像,所以这些网格具有同样的参数化。



图3. 几何曲面的LOD表示,从低模到高模。

图4显示在渲染过程中,对于镜头可以看到的部分,曲面的解析率可以动态提高,而对于镜头看不到的部分,曲面的解析率可以动态降低。例如贴近佛像的头部,佛像的身体部分可以用很粗糙的三角剖分;从右侧观察天使的雕像,则右侧的三角剖分比左侧精细很多。

图4. 三角网格的LOD表示,局部的解析率根据视点动态变化。

类似的,纹理图像也有不同的解析率,将一张高清的纹理图像下采样,得到一系列的纹理图像,被称为纹理图像的mipmap金字塔。如果渲染画面的屏幕具有高解析率,曲面距离镜头很近,需要采用高解析率的纹理图像,否则采用金字塔高层的纹理图像。

图5. 纹理图像的mipmap pyramid.

如图6所示,反之给定低模的三角网格,可以依据一定的规则,将网格加细(subdivision),得到更为精细的三角网格。多次细分之后,三角网格几乎处处收敛到光滑的样条曲面。三角网格细分的规则可以写入tessellation shader,由硬件自动完成。

图6. 三角网格的细分(subdivision)。

纹理图像可以存储更多的信息,例如每个像素可以记录颜色、法向量、材质、金属、背景光、散射、高光、透明度、几何高度、几何位移等很多信息,用于描绘物体表面的细节。低模加上高模生成的法向量贴图可以提高渲染质量和速度。

图7. 法向量纹理。

在游戏中,法向量贴图经常用来增加人脸曲面的几何细节,特别是皱纹。如图8和图9所示,建模师的雕塑完成后,人物皮肤表面比较光滑,应用了法向量贴图之后,皱纹效果显现出来,同时皮肤更具质感。

图8. 左帧,没有用法向贴图;右侧,应用了法向贴图

图9. 法向纹理用于描述人脸皱纹
( by Alander Alexei)

二.虚拟纹理技术

对于高质量、复杂场景的游戏,纹理图像的数据非常庞大,无法存储在GPU的内存之中,这时必须借助虚拟纹理技术(Virtual Texture)。例如游戏的场景设定在一个山峦地区,有航拍的地形几何数据,如图10所示,同时有不同解析度的纹理数据,例如近景拍摄的照片。在脑海中为地形曲面建立虚拟的坐标,并将所有的照片融合成一张巨大的纹理图像,覆盖整个游戏世界,这张笼罩乾坤的纹理图像,就被称之为虚拟纹理。

图10. 地形的几何数据。

虚拟纹理的UV坐标,被称为虚拟坐标,或者虚拟地址空间。玩家在山峦中穿行的每一刹那,都对应着虚拟地址空间中的某一个点。游戏系统实时跟踪玩家的行迹,从而得知其任意时刻的虚拟坐标。由于虚拟纹理过于巨大,将其切割成很多小块,每一小块被称为一个页面(page),如图11所示。任意时刻,系统只保留与玩家位置临近的少数页面在GPU显存之中,其他的页面依然放在硬盘之中。当玩家在山峦中游走,系统实时判断缺失的页面,依照一定规则(例如 Least Recently Used)淘汰过期无用的页面。这种动态更新GPU内存中页面的算法与传统的虚拟内存算法非常类似。

图11. 地形纹理的虚拟地址空间,每一个方格代表一个页面。

在现代游戏引擎中,每一帧屏幕画面被渲染两次,第一次渲染,系统计算每一个像素的虚拟坐标,由虚拟坐标决定对应的页面编号,同时根据遮挡、远近决定纹理mipmap的层次。然后,系统由虚拟坐标(页面,层次)查找对应的物理坐标,如果有页面缺失,系统去硬盘查找并调入GPU内存。以ID公司的游戏Rage来举例说明。图12是玩家看到的渲染画面,图12是系统第一次绘制出的画面,这里每一个方格对应一个页面,如此得到每一个像素对应的虚拟纹理坐标。图14是当前GPU内存中存储的活跃页面。

图12. GPU内存中存储的当前活跃的页面,物理内存32乘32页面,ID公司,Rage。

图13简略地给出了虚拟纹理的示意图。从虚拟地址到物理地址的映射被保存在GPU中的一张查询表格中(Page Table),这张表格一般是四叉树结构,也用纹理图像来表达。维护这张表格,动态更新物理纹理,是虚拟纹理系统的核心任务。

图13. 虚拟纹理系统原理示意图 (Mayer, Scheiblauer and Mayer)。

一旦渲染当前画面所需的页面都在GPU内存之中,系统进行第二次绘制。像素渲染器(pixel shader)可以通过查询Page Table从虚拟纹理坐标找到物理坐标,从而得到相应的纹理像素,再经过滤波,融合,得到当前像素的颜色值。当然,真实的虚拟纹理系统的算法非常复杂,软硬件分工也非常考究,这一系统对于整个游戏的质量具有决定性的影响。

图14. Graphine虚拟纹理的演示
(by Al Josha Demeulemeester)。

图14展示了Granite SDK 5.0 的虚拟纹理技术。一架双体飞机在山峦大海上空飞行,系统计算了虚拟纹理坐标,得到对应的页面编号和细节层次,调度GPU内存,从而实时渲染,得到逼真的绘制效果。

三.几何图像方法

虚拟内存技术使得艺术家不再担心纹理的存储量,纹理图像可以被实时流送(页面调度)放缩(mipmap),游戏设计师不必考虑纹理的内存预算、绘制次数。这里,如果将“纹理”换成“几何”,得到是Epic Game关于Nanite虚拟几何技术的广告词。

迄今为止,几何的三角网格表示与纹理图像表示依然泾渭分明,纹理图像还是贴附在三角网格之上的。虽然虚拟纹理技术为艺术家极大地解放了纹理设计,但是对于几何依然于事无补,对于影视级别的高解析度几何曲面,系统依然无法承担。那么,为什么不能将几何数据也虚拟化呢?例如,将庞大的地形数据放在硬盘上,只在GPU
Cache中保存当前活跃的页面,通过实时调度,来保证玩家的体验?理论上,这种思路没有任何障碍。

首先,将地形几何曲面整体参数化,覆盖整个虚拟地址空间,覆盖整个虚拟纹理图像;然后,将整个虚拟地址空间切割成页面,随机调度进入GPU内存。但是,在这里遇上了一个瓶颈:三角网格的不规则性。如图15所示,人脸曲面的组合结构非常不规则,需要存储顶点的位置信息,同时也要存储顶点之间的连接关系,如何在GPU内存页面中表达如此复杂的组合结构,并且从组合结构随机存取顶点信息,这是一个非常棘手的问题。

图15. 三角网格的不规则性。

一个简单的解决方案是将三角网格规则化,即将曲面在参数域上用规则的格点重新采样,用二维矩阵来表示曲面,这就是几何图像想法【1】的初衷。


图16. 几何图像示意图。

如图16所示,将大卫王雕像(top left)共形参数化到平面长方形(top right),规则采样,将三角网格转换成几何图像(middle left)和法向量纹理(middle right),几何图像中的每一个像素的红绿蓝颜色值代表相应顶点的三维位置,规则的格点(像素的行列序号)给出了顶点之间的连接关系。几何图像代表的曲面显示在下面一行,左帧是下采样得到的低模曲面,右帧是原始几何图像代表的高模曲面。如此,几何图像的LOD和纹理图像的mipmap 相统一。

在虚拟地址空间,几何图像与各种纹理图像相重合,被分割成同样的页面,在内存调度过程中同进同退,同时流送,在绘制过程中同步放缩(mipmap)。

这样的机制减少了带宽消耗和GPU内存消耗,提高了几何与纹理的局域性,更加利于visibility culling。同时,中间计算结果可以存储成一张虚拟纹理,提高GPU的任务处理的同步性,简化了绘制流程。当然,应用tessellate shader和procedure decal,可以动态添加更多的几何与纹理。

几何与纹理的同步虚拟化,使得游戏设计师和艺术家不再顾虑几何与纹理的存储量、内存预算与绘制次数,极大地解放了他们的艺术天性。由此,相信Nanite虚拟微多边形几何技术应该类似于虚拟纹理技术与几何图像技术的融合。

四. 小结

将几何数据虚拟化,让艺术家在虚拟地址空间中纵横驰骋,的确是划时代的进步。这项技术需要将复杂场景的几何全局参数化到统一的虚拟地址空间之中,同时使得这一映射带来的畸变尽量的小。这需要微分几何的理论来保证。如图19所示,将欢喜佛映射到平面圆盘,左帧的参数化保持曲面局部形状不变,右帧的映射保持曲面的面积元不变。保形变换的算法对于任意拓扑曲面都适用,保面积变换的算法对于任意维数的流形都适用。计算共形几何【2】为保形变换算法奠定了理论基础,最优传输理论为保面积变换奠定了基础。因此,虚拟几何图像的理论已经完备,算法相对成熟。工业界正在开始大规模推广应用。

期望虚拟几何与纹理技术会推进三维工业的进一步发展,例如游戏动漫、VR、AR以及医学影像。

【1】 X. Gu, S. Gortler and H. Hoppe, Geometry Images, SIGGRAPH 2002,
http://hhoppe.com/proj/gim/

【2】顾险峰,丘成桐,《计算共形几何-理论篇》,高等教育出版社,2020

虚拟纹理与几何图像技术相关推荐

  1. java识别图片中的图形形状_基于Java+OpenCV技术对几何图像颜色与形状识别

    基于 Java+OpenCV 技术对几何图像颜色与形状识别 杨思阳 黄军 吴春秋 (黔东南民族职业技术学院,贵州 凯里 556000) [摘 要] 通过 Java 调用 OpenCV 视觉库实现几何图 ...

  2. 翻译 Albert Julian Mayer 关于虚拟纹理的论文(2. 相关工作)

    第2章:相关工作 本章旨在概述纹理映射的历史,特别强调对特大纹理的支持,并揭示了当前最先进技术(即虚拟纹理)的进展. 本章首先简要介绍纹理映射,然后研究处理特大纹理数据集的不同方法,即压缩.合成 和 ...

  3. 三维图像技术与OpenGL基础理论

    原文   http://blog.csdn.net/yarkey09/article/details/38026413 主题 OpenGL 英文原文: 3D Graphics with OpenGL ...

  4. 极客星球 | 图像技术在上亿规模实拍图片中的应用

    ​ 编者按: 闲鱼高级算法专家远悠近日出席了由MobTech袤博科技主办的[CoderPark]直播活动,与MobTech专家以及行业知名算法KOL齐聚云端,并分享了图像技术在上亿规模实拍图片中的应用 ...

  5. CVPR 2019 论文解读 | 基于多级神经纹理迁移的图像超分辨方法 (Adobe Research)

    基于多级神经纹理迁移的图像超分辨方法 超分辨(Super-Resolution)图像恢复旨在从低分辨模糊图像中恢复出高分辨的清晰图像,是计算机视觉中的一个重要任务,在工业界有非常强的应用前景.CVPR ...

  6. 解析:图像技术在直播中怎么用?聊一聊美女主播背后的美颜技术

    看到一篇文章:给了很大启发 原文: https://www.yidianzixun.com/n/0EqVDsBT?utk=821p9863&appid=yidian&ver=4.3.9 ...

  7. python画三维几何图-Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包含点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义. 图像的一个像素点有1或者3个值.对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值.他们表现出 ...

  8. 模式识别之基础---使用纹理滤波器分割图像

    使用纹理滤波器进行分割就是利用图像中不同区域的纹理来对图像的区域进行划分.纹理是指一个物体上的颜色模式或者指物体表面的光滑程度.纹理描述图像中的区域特征,试图直观地定量描述诸如光滑.质地等参数.在遥感 ...

  9. obj模型转json模型_微软文字转图像技术又进化,提出两种 GAN 的升级模型 | CVPR 2019...

    雷锋网 AI 科技评论按:目前基于描述的绘图机器人在图像生成质量以及包含多个目标和丰富关系的更复杂场景中生成图像仍然存在较大挑战.来自微软人工智能研究院 .JD 人工智能研究院及纽约州立大学奥尔巴尼分 ...

最新文章

  1. 1.3创建项目「深入浅出ASP.NET Core系列」
  2. JavaScript 关闭窗口事件
  3. [转]安卓开发startservice 和bindservice详解
  4. python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...
  5. 魔术师发牌问题 java_魔术师发牌问题--java实现
  6. NodeJS+Express+mySQL服务端开发详解
  7. python学习笔记 --- 随机数进阶
  8. apache.camel_Apache Camel 2.14中的更多指标
  9. 向其他进程注入代码的三种方法
  10. java that关键字_Java中this关键字的几种用法
  11. 信息学奥赛一本通C++语言——1029:计算浮点数相除的余
  12. 二叉树2 - 数据结构和算法44
  13. 关于“稳定”的相爱相杀:负载测试和压力测试
  14. ImageLoader的简单分析(终结篇)
  15. 关于建站、服务器、云虚拟主机你想知道的都在这里!
  16. 浅析Windows域环境身份认证与攻击思路
  17. Xcode8使用出现bundleid: com.jd.***, enable_level: 0, persist_level: 0, propagate_with_acti
  18. 使用蒙特卡罗法解决道填图题目
  19. 数学建模之出租车数目估计
  20. input调起ios摄像头拍照旋转问题解决思路

热门文章

  1. Go 学习笔记(59)— Go 第三方库之 etcd/clientv3 封装为方法使用(建立连接、设置key-value、获取key-value、获取带前缀的key-value)
  2. torch.nn.Linear()函数的理解
  3. 激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊
  4. 机器视觉系统的几个问题解析
  5. 2021年大数据常用语言Scala(十八):基础语法学习 Map对象
  6. [JS] 题解:提取不重复的整数
  7. AttributeError: 'dict' object has no attribute 'status_code'
  8. Vim 命令、操作、快捷键全集
  9. 【基本操作】主席数统计区间不同颜色个数
  10. [luogu3760 TJOI2017] 异或和(树状数组)