翻译 Albert Julian Mayer 关于虚拟纹理的论文(1. 介绍)

2024-09-06 23:08

本文主要是介绍翻译 Albert Julian Mayer 关于虚拟纹理的论文(1. 介绍),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

译者前言

在搜寻关于虚拟纹理相关资料的时候,我发现了这篇论文:
在这里插入图片描述
这似乎是 维也纳科技大学计算机科学系 的学生 Albert Julian Mayer 的研究生学位论文。
这篇论文也出现在了 2014 GDC Adaptive Virtual Texture Rendering in Far Cry 4 的参考文献之中。

我希望通过翻译这篇论文来学习虚拟纹理的基础概念等知识。

摘要

在实时渲染大型场景时,存在纹理数据对于显存或主内存过大的问题,虚拟纹理(由 Martin Mittring 在《Advanced Virtual Texture Topics》(SIGGRAPH 2008 )中提出,区别于 clipmap-style 系统)是一种针对此问题的解决方案。虚拟纹理的工作原理是将所有纹理数据预处理为大小相同的图块,并在每帧之前确定渲染所需的图块。然后将这些图块流式传输到显卡,并使用特殊的虚拟纹理片段着色器执行渲染,该着色器会调整纹理坐标以从图块中采样。

本文给出了虚拟纹理和相关主题的全面描述,并研究了这项技术面临的挑战,包括预处理、可见图块的确定、纹理过滤、图块重要性指标等。重点研究了视图空间中的图块确定,并介绍了在 OpenCL 中压缩结果缓冲区的实现。通过在片段着色器中使用具有特定坐标调整和梯度校正的图块边界,将能够以正确的过滤来渲染出图块对应的纹理。

本文描述了一个示例实现,用于提供有关不同设置和架构选择下的性能和正确性。并集成到了 Open Scene Graph 中以在 hybrid point-cloud 和 多边形渲染器中使用,可以用它来渲染用点云建模的地下墓穴中的高分辨率绘画。还展示了另一个应用程序,实时显示具有超过 60 GB 纹理的纽约高细节模型。

定量分析表明,即便使用过时的硬件,也能以 200 FPS 以上的帧速率渲染具有数百万个多边形的复杂场景,同时保持高质量。结果表明,当所需的纹理图块没有及时准备好时发生的 “回退” 平均只发生在 0.01% 的像素上。这些结果表明,虚拟纹理可以成为游戏、科学和工业应用中,具有竞争力的解决方案,它允许实时渲染以前无法渲染的场景,同时还保持可接受的视觉质量。

第1章:介绍

由于电子设备和数字媒体无处不在,计算机图形学是一个不断发展的领域,现在大多数人每天都会接触到它。“纹理映射” 是许多计算机图形应用程序的组成部分。“虚拟纹理” 解决了纹理数据不断增加但纹理内存有限的问题,这是本文致力于的主题。

1.1 背景和动机

今天,“表面” 的实时3D渲染几乎完全由多边形光栅化完成。对象由多边形构建的网格近似,光栅化将多边形转换为光栅图像,即屏幕上的输出像素。而纹理映射是一种普遍支持的技术,它通过将代表颜色的图像投影到多边形上来添加细节。但是,通常只有在场景的 “几何图形” 和 “纹理” 可容纳在显卡有限的显存时才能执行实时渲染。

虚拟纹理是一种解决方案,它允许实时渲染包含超过可用显存甚至主内存的纹理贴图的场景,因此构成了所谓的“核外”渲染解决方案。已经有很多关于核外渲染的研究,但其中大部分都只关注几何方面,而且几乎所有处理纹理的资源都仅限于地形(或至少是平面)场景。这个问题一直没有解决,直到最近,具有足够性能的可编程 GPU 开始以所谓的虚拟纹理的形式实现解决方案。解决这个问题的重要性怎么强调都不为过,因为实时应用程序的纹理数据需求正在上升,这不仅仅是由于分辨率的提高(例如航空成像和扫描设备),还因为将几何细节转换为纹理数据(法线贴图)的持续趋势,以及对视觉上令人信服的虚拟世界的渴望。虽然大家对虚拟纹理的兴趣似乎非常高,但关于虚拟纹理的公共资源仍然很少,而且大多数都是相对非正式的。迄今为止,关于该主题的信息最丰富的资源仍然是 Sean Barrett 的“稀疏虚拟纹理”网页,其中包含有关虚拟纹理的视频和示例实现。科学杂志上还没有一篇关于这个主题的学术论文发表。高需求加上很少的“供应”是进行虚拟纹理工作的动机的一部分,但这种解决复杂问题的优雅简单的性质及其带来的无限有趣的可能性也同样重要。我们希望这篇论文能够消除围绕该主题的资源不足并作为综合参考。

1.2 目标与讨论范围

本论文的目的是评估虚拟纹理在不同用例上的性能正确性,成为虚拟纹理最全面的资源,提供对所有基本组件和问题的详细检查以及为在开发虚拟纹理系统时必须进行的所有权衡提供经验数据(例如,基准)。此外,我们的目标是展示相关的想法以及我们的具体实现(LibVT)和一个引人注目的现实世界用例(纽约场景)。

本论文假设读者熟悉计算机图形原理和与实时 3D 渲染相关的编程问题,包括 3D图形API 和着色器开发的知识。

本论文的范围是虚拟纹理和所有与其直接相关的主题。范围包括普通虚拟纹理实现的所有通用组件以及过滤等普遍问题的解决方案。本论文还包括一些间接相关的主题、相关的想法和仅对某些用例很重要的事项,但是,它并不试图在这方面做到详尽无遗。换句话说,本论文的目的不是包括所有可能的想法(比如以某种方式与虚拟纹理相关联,或是可能仅在虚拟纹理应用的一个子集中有用)。

本论文试图在高层级的科学描述,和实际应用的关注点之间取得中间立场。 这里遵循的准则是,我们在认为不明显和重要的地方提供准确的细节,但在细节明显很重要的情况下采用更详细的解释。 例如,我们确实提供了用于虚拟纹理的示例着色器代码,因为它被认为是一个完整的部分。但是,我们没有提供任何用于开发 page-loading 线程的低级细节,因为这对任何程序员来说都是显而易见的。

本论文的目的不是对特定领域(例如游戏行业)所涉及的所有重要的虚拟纹理问题进行彻底的研究。 虽然我们确实提供了一些关于虚拟纹理在游戏中适用性的见解,但这些决不是详尽的,它们仅涵盖了基本问题,并没有补充想法。 此外,如果一些问题并非必要,且其他虚拟纹理资源已经处理过,则我们会尽量避免详细介绍这些问题。详细请参阅第 2.5.5 节了解虚拟纹理的补充资源,特别是《Advanced Virtual Texture Topics》(SIGGRAPH 2008 ),它从游戏开发者的角度进行了研究。

1.3 结构

本论文的结构分为以下几章:

  1. 正是这一章。
  2. 相关工作。本章评估了使用大型纹理数据集的相关工作,包括纹理压缩、纹理合成和纹理缓存,并提供了迄今为止所有虚拟纹理资源的总体视图。
  3. 概述。提供虚拟纹理系统的大纲,以便于理解更详细的主要章节。
  4. 虚拟纹理。这是本论文的主要章节,涵盖虚拟纹理和相关问题。
  5. 实施与结果。我们的实现、我们的真实测试场景和我们的测试结果都在这里展示。
  6. 结论。本章通过总结我们的发现并为未来的研究领域提供建议来结束本文。

1.4 贡献

本论文的贡献可以分为以下几类:

  • 虚拟纹理的详细解释,分为三个不同的部分:图块确定图块的流加载虚拟纹理着色器
  • 研究与虚拟纹理相关的所有问题和挑战,包括对其解决方案的彻底研究。
  • 通过测试和Benchmarks测试,来呈现数值数据,以此来量化虚拟纹理实现中的大多数权衡和选择。还收集了仅与虚拟纹理间接相关的事实数据,例如文件大小和文件加载时间之间的关系。
  • 研究不同重要程度的与虚拟纹理相关的新想法。一些想法也与其他当前的虚拟纹理工作并行独立开发(例如,the GPGPU buffer reduction idea and the first correspond- ing kernel)。其他新想法的示例在术语“图块重要性”和“图块请求替换”下呈现。
  • 在 OpenGL 应用程序中实现了一个完整的、可配置的虚拟纹理库,称为 “LibVT”。 库的通用集成能力已经通过将它集成到两个不同的渲染引擎中得到了证明。
  • 开发用于将(基于 OBJ 文件的)场景转换为虚拟纹理的管线,包括纹理图集工具和在磁盘上生成存储虚拟纹理图块文件的工具。
  • 处理、转换和导入具有高几何复杂度和高纹理要求的真实世界 3D 场景(“纽约”),用于首次实时显示场景,作为概念的证明。

1.5 方法和设置

本论文中使用的方法是,通过创建和测试虚拟纹理的实现,来获得知识。 进一步来说:

  1. 基础知识:
    实现基本的虚拟纹理,以了解虚拟纹理系统的三个主要组件及其交互。
  2. 问题:
    在我们的示例实现中解决了虚拟纹理系统的主要问题和困难,以此来完全理解此项技术所面临的问题及其解决方案。
  3. 选项:
    我们的测试系统中实施了许多可配置选项,以便能够量化虚拟纹理系统中不同选择的影响和权衡(图块大小、PBO 使用、进入回退 vs 着色器循环、回读性能和正确性、等等)。
  4. 数据:
    对于在虚拟纹理系统中难以量化的选项和选择,开发了独立的 benchmark 测试应用程序。 示例包括:图块解压缩库、耦合和解耦图块加载、纹理采样方法等。

测试期间首要考虑的是可复现性,只发布可复现的结果。 例如,在包括硬盘访问的测试期间,通过禁用页面缓存(由操作系统缓存文件)和清除磁盘缓冲区(由硬盘缓存文件)来确保可复现性。 结果是从 5 次测试运行(或更多)生成的,图表包括了标准偏差作为误差线。 对于随时间的推移持续跟踪值的测试,也会执行多次以确保可复现性,但结果图是从单次运行中挑选出来的。 涉及实时渲染的测试使用视锥体来执行剔除,没有其他形式的剔除。

所有测试均使用此计算机设置执行:
Mac Pro 四核 2006(2 x Intel Xeon DP 5150 @ 2.66 GHZ,7 GB DDR2 ECC FB-DIMM,NVIDIA GeForce 8800 GT 512MB 显卡,Seagate 7200.12 1TB 硬盘,Mac OS X 10.6)

唯一的例外是使用“Hitachi Travelstar 7K320 320 GB”测试读取不同文件大小文件时间的 benchmark 测试。

这篇关于翻译 Albert Julian Mayer 关于虚拟纹理的论文(1. 介绍)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143381

相关文章

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.