用纹理图集优化3D场景性能【Texture Atlas】

news2025/1/31 8:09:12

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

在 Unity 中开发移动应用程序时,确保一切都得到优化始终至关重要。 最大化帧速率使我们能够专注于优化脚本、烘焙灯光、修改对象等。

当我们将移动应用程序带入虚拟现实时,这一点变得更加重要。 虽然我们可以关注许多领域来采取措施进行优化,但我们将只关注其中一个,即纹理图集(Texture Atlas)。

1、为什么要使用纹理图集?

纹理图集是我们将所有游戏图像或纹理逻辑分组到一个文件(也称为精灵表)中的一种方法。
在这里插入图片描述

当在 Blender 等建模程序中创建对象时,每个图像的坐标可以映射到我们想要使用的对象上。 这使得 Unity 中的渲染效率更高,我们可以让许多对象共享相同的材质。 当我们后续将对象设为静态时,Unity 就可以使用静态批处理,将(不移动的)游戏对象组合成大网格,并以更快的方式渲染它们。

2、制作我们的贴图

为了创建和使用纹理图集,我们需要能够为 Unity 创建自己的对象并将图像放入一个文件中。 为了将图像放入一个图形中,我们可以使用 Gimp,一个免费的图像编辑程序。 为了将我们的图集映射到一个对象上,我们可以使用 Blender,一个 3D 建模程序。

2.1 添加图像

为了这个演示,我们只看下面的几个对象。 想到一些我们想要使用的材料,我们可以在网上抓取它们并将它们保存到我们的计算机上。

在这里插入图片描述

保存图像后,我们可以在 Gimp 中创建 1028x1028 图像,并将每个图像拖放到我们的纹理图集中。 图像的大小可以是任何大小,只要不是很大即可。

当收集纹理图集的图像时,对图像进行逻辑分组是有意义的。 如果我们有一栋建筑物,我们可以将所有这些纹理(砖块、墙壁、地板等)放入一个纹理集中。 对于我们的角色,我们也可以这样做。 这使事情变得井井有条,但在这种情况下我们并不挑剔。 让我们把它们全部扔到这里吧。
在这里插入图片描述

使用 Gimp 将所有图像拖入我们的 1028x1028

下面是最后得到的完整图像:
在这里插入图片描述

完整的纹理图集

需要注意的一件事是这些都是简单的图像。 有一些程序可以为 3D 模型生成精致的纹理。 然而,在我们的例子中,即使没有它,我们仍然可以在形状上获得漂亮的纹理。

2.2 创建和映射我们的贴图

纹理图集完成后,下一步是打开 Blender。 我们可以通过按住 Shift + A 并选择“网格”>“立方体”来添加要使用的图元。
在这里插入图片描述

Shift + A 快捷键

在这里插入图片描述

看……立方体

下一步是分割窗口,以便可以看到我们的对象,很快就能看到我们的 UV 图像编辑器。 我们可以单击窗口的右上角并向左拖动以创建两个视图。

在这里插入图片描述

然后在底部选择编辑器类型图标以切换到 UV/图像编辑器视图。

在这里插入图片描述

现在设置了视图,我们就可以做事情了。 当 Unity 将材质分配给游戏对象时,它使用 UV 坐标作为参考,以便正确映射每个纹理。 UV 很像 X/Y 坐标系。 如果未定义,我们的整个纹理图集将映射到该对象。 我们很快就会发现,通过将模型的 UV 坐标定义到图集纹理,Unity 将知道对象的哪一部分与纹理图集匹配。

在这里插入图片描述

左边是 3D 查看器……右边是 UV/图像编辑器

选择左侧窗口,我们可以点击选项卡并切换到编辑模式。 这使我们可以选择对象的所有或单个部分。 通过 快捷键a 我们可以选择所有内容。
在这里插入图片描述

在编辑模式下,我们可以仅选择面来定位立方体的一侧。

2.3 展开我们的对象

选择所有对象后,我们必须打开它。 这将获取我们的 3D 形状并将其展开到 2D 平面上,以便我们可以定义将其映射到纹理的哪个部分。

回到立方体的 3D 视图,我们可以点击 u 进行展开,然后选择展开。 这将在我们的 UV/图像编辑器中展开所有面。 如果我们选择智能 UV 投影,我们可以将所有面映射到彼此相邻的位置。 这在展开复杂对象时非常有用。

在这里插入图片描述

左图:展开示例 — 右图:智能 UV 投影

接下来,打开我们的纹理图集并加载它。

在这里插入图片描述

这将加载图像并让我们看到展开的图像落在纹理上的位置。 显然,我们不需要整个图像,因此我们需要点击 a 来选择所有内容。 然后我们可以按 s 将选区缩放到我们选择的纹理。
在这里插入图片描述

展开的图像(当前未选择)覆盖整个纹理图集

一旦展开的比例缩小到我们喜欢的程度,我们就可以按 g 抓住它并将其移动到我们目标的任何纹理。 在这种情况下,浅木纹。
在这里插入图片描述

完成后,我们可以保存文件,现在我们有了一个带有映射 UV 坐标的对象,引用了这个纹理图集。

2.3 映射不同的面

在进入 Unity 之前,应该注意的是,我们可以单独选择每个面。 就我们的立方体而言,每个面都可以映射到纹理图集中的不同纹理,并且效果很好。 在这种情况下,立方体已经映射,我们可以在 3D 查看器中选择立方体的一个面。 我们需要确保处于编辑模式并且可以选择面。

其对应的展开如下所示。 转到 UV/图像编辑器并点击 a 选择所有点,然后我们可以点击 g 将展开的立方体面移动到我们想要分配的任何纹理。
在这里插入图片描述

我们可以对每个面或少数几个面执行此操作,以实现更精细的纹理。 当我们的模型变得更加复杂时,这会很有用。
在这里插入图片描述

绘制立方体的三个独立面
在这里插入图片描述

选择要在 UV/图像编辑器中绘制的凳子底座

在进入 Unity 之前,我们创建几个对象(球体、圆柱体等)并将它们映射到我们的纹理图集中。 然后我们就准备好了。

3、将3D模型导入Unity

一旦我们在 Blender 中创建了已映射到纹理图集的对象,我们就可以将这些对象拖到 Unity 中,拖到我们的项目窗口中。 如果我们有一个 prefabs 文件夹,我们可以将它们放入其中。
在这里插入图片描述

通常,我们的对象及其材质将导入到 Unity 的材质文件夹内。 但有时,你可能会发现只是浪费了一个小时来打开物体。 如果发生这种情况,有解决办法。 在 Unity 中,我们应该导入纹理图集。 我们可以将其与其余纹理放在一起。

在这里插入图片描述

然后在项目窗口中右键单击并选择“创建”>“材质”。 选择材质后,查看检查器并确保我们选择了移动/不发光(支持光照贴图)。 由于我们专注于移动设备,因此我们将把所有灯光烘焙到纹理中。 分配移动/无光照着色器是实现此目的的好方法。

一旦我们指定了“移动/不照明”,我们就可以选择与该材质关联的纹理。 这是我们单击“选择”并找到我们的纹理图集的地方。
在这里插入图片描述

拥有 Mobile/Unlit 可确保移动设备上的最佳性能
在这里插入图片描述

一旦我们的纹理被分配给材质,对象就会更新

现在我们有了使用纹理图集的材质,我们在 Blender 中映射的任何对象都可以很好地与我们指定的纹理同步。

3.1 静态化并烘焙场景

使用相同材质设置所有对象后,下一步就是利用 Unity 的静态批处理。 通过将所有对象标记为静态,可以快速完成此操作。 假设这些在我们的应用程序中没有动画,这是必须做的。

使用一些聚光灯以获得良好的效果,我们确保将它们标记为区域(仅烘焙)。 这样,我们的场景显然得到了一些光线,而且我们的对象现在也可以将光照烘焙到它们的纹理上,因为它们现在是静态的。

为了使这些更改可见,我们可以转到“窗口”>“照明”>“设置”并为场景生成照明。

在这里插入图片描述

烘焙场景

3.2 静态批在哪里?

我们在开始时提到,静态批处理是优化场景渲染的一种方法。 Unity 采用具有相同材质的静态对象,然后将其渲染为一个大网格,以加快速度。 Unity 中更少的绘制调用意味着每秒更多的帧,当我们有 1000 多个对象时,我们就会明白为什么这如此重要。

由于我们为对象创建了纹理图集,Unity 可以完成一次绘制所有游戏对象。 查看实际情况的一种方法是使用帧调试器。

3.3 Unity 的帧调试器

帧调试器允许我们在播放模式期间暂停游戏并分解每个帧的渲染方式。 通过逐步浏览右侧层次结构中的每个项目,我们可以看到每个渲染的顺序。 请注意,Static Batch 行在游戏视图下方突出显示,我们看到 Unity 通过一次绘制调用一次性渲染所有这些对象。 很好,对吧?

在这里插入图片描述

如果我们为每个对象分配不同的材质,我们就会增加绘制调用并强制 Unity 单独渲染每个对象,如下所示。 效率不太高。
在这里插入图片描述

没有共享材材质,就没有静态批处理

4、图集、拆包和批次……

生成简单的纹理图集可以让我们在 Unity 中跨多个游戏对象创建共享材质。 如果我们能够在 Blender 等 3D 建模工具中创建或修改模型,我们就可以更好地控制这些纹理的映射,并使我们的应用程序运行更高效。

尽管移动设备变得越来越强大,但我们仍在不断突破硬件的极限。 我们需要优化应用程序以提供最佳用户体验的多种方法中,这只是实现这一目标的重要一步。 记住纹理图集。


原文链接:用纹理图集优化3D场景 — BimAnt

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

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

相关文章

嵌入式Linux应用开发-文件 IO

嵌入式Linux应用开发-文件 IO 第四章 文件 IO4.1 文件从哪来?4.2 怎么访问文件?4.2.1 通用的 IO 模型:open/read/write/lseek/close4.2.2 不是通用的函数:ioctl/mmap 4.3 怎么知道这些函数的用法?4.4 系统调用函数怎么…

基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:用户的功能设计为:管理员的功能设计为:健身房的功能设计为:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获…

QFrame类学习笔记

1、QFrame的作用 QFrame类继承于QWidget类,被QAbstractScrollArea, QLabel, QLCDNumber, QSplitter, QStackedWidget, and QToolBox等类继承。 QFrame作为许多基础控件的基类,提供许多成员方法给子类,实现子类的框架样式的设计。框架样式主要…

Android 13 定制化开发--开启相机或麦克风时,去掉状态栏上的绿色图标

Android 12 或更高版本的设备上,当应用使用麦克风或相机时,图标会出现在状态栏中。如果应用处于沉浸模式,图标会出现在屏幕的右上角。用户可以打开“快捷设置”,并选择图标以查看哪些应用当前正在使用麦克风或摄像头。图 1 显示了…

Ubuntu 安装Kafka

在本指南中,我们将逐步演示如何在 Ubuntu 22.04 上安装 Apache Kafka。 在大数据中,数以百万计的数据源生成了大量的数据记录流,这些数据源包括社交媒体平台、企业系统、移动应用程序和物联网设备等。如此庞大的数据带来的主要挑战有两个方面…

【数据结构】插入排序:直接插入排序、折半插入排序、希尔排序的学习知识总结

目录 1、排序的基本概念 2、直接插入排序 2.1 算法思想 2.2 代码实现 3、折半插入排序 3.1 算法思想 3.2 代码实现 4、希尔排序 4.1 算法思想 4..2 代码实现 1、排序的基本概念 排序是将一组数据按照预定的顺序排列的过程,排序的基本概念包括以下内容…

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言,网站开发扫盲知识 1.网站搭建开发包括什么? 前端 前端开发主要涉及用户界面(UI)和用户体验(UX),负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…

数据结构--快速排序

文章目录 快速排序的概念Hoare版本挖坑法前后指针法快速排序的优化三数取中法小区间用插入排序 非递归的快速排序 快速排序的概念 快速排序是通过二叉树的思想,先设定一个值,通过比较,比它大的放在它的右边,比它小的放在它的左边…

Python中的数据常见问题

数据可视化在Python中是一个非常重要的主题,它可以帮助我们更好地理解和分析数据。无论是探索数据的特征,还是向其他人展示数据的结果,数据可视化都起到了关键作用。然而,在进行数据可视化时可能会遇到一些常见问题。本文将为您分…

基于微信小程序的同城家政服务预约系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

DC电源模块关于宽电压输入和输出的范围

BOSHIDA DC电源模块关于宽电压输入和输出的范围 DC电源模块是一种电子设备,能够将输入的直流电源转换成所需的输出电源,用于供电各种电子设备。其中,关于宽电压输入和输出的范围,是DC电源模块常见的设计要求之一。本文将详细介绍…

嵌入式Linux应用开发-基础知识及GCC 编译器的使用

嵌入式Linux应用开发-基础知识及GCC 编译器的使用 第一章 HelloWorld 背后没那么简单1.1 交叉编译 hello.c1.2 请回答这几个问题1.3 演示 (...) 第二章 GCC 编译器的使用2.1 配套视频内容大纲2.1.1 GCC 编译过程(精简版)2.1.2 常用编译选项2.1.3 怎么编译多个文件2.1.4 制作、使…

深度学习:模型训练过程中Trying to backward through the graph a second time解决方案

1 问题描述 在训练lstm网络过程中出现如下错误&#xff1a; Traceback (most recent call last):File "D:\code\lstm_emotion_analyse\text_analyse.py", line 82, in <module>loss.backward()File "C:\Users\lishu\anaconda3\envs\pt2\lib\site-packag…

【Unity】LODGroup 计算公式

Unity 在配置 LodGroup 时&#xff0c;其分级切换的计算方法是按照物体在相机视野中占据的比例计算的。在运行时&#xff0c;如果相机视野范围&#xff08;Field of View&#xff09;没有改变&#xff0c;那么这个值可以直接换算成物体距离相机的距离。这里就讨论下如何计算得到…

ubuntu下用pycharm专业版连接AI服务器及其docker环境

一&#xff1a;用pycharm专业版连接AI服务器 1、首先在自己电脑上新建一个文件夹&#xff0c;后续用于映射服务器上自己所要用的项目文件 2、用pycharm专业版打开该文件夹&#xff0c;作为一个项目打开 3、然后在工具->部署->配置 4、配置中形式如下&#xff1a; 点击左…

Chatbot UI集成LocalAI实现自托管的ChatGPT

本文比惯例提前了一天发&#xff0c;因为明天一早&#xff0c;老苏就踏上回乡的路了&#xff0c;三年没回老家&#xff0c;这次专门请了 2 天的假 难得回家&#xff0c;打算多陪陪家人&#xff0c;和多年不见的朋友聚聚&#xff0c;当然如果有网络条件&#xff0c;还是会正常发…

英语单词记忆学习打卡系统 微信小程序

本单词记忆系统使用了计算机语言Java和存放数据的仓库MySQL&#xff0c;采用了微信小程序模式来实现。本系统使用了框架SSM和Uni-weixin实现了单词记忆系统应有的功能&#xff0c;系统主要角色包括管理员和用户。 关键词&#xff1a;Java&#xff1b;MySQL&#xff1b;SSM  在…

Unity实现设计模式——命令模式

Unity实现设计模式——命令模式 推荐一个Unity学习设计模式很好的GitHub地址&#xff1a;https://github.com/QianMo/Unity-Design-Pattern 有非常多的Star 一、介绍 命令模式使得请求的发送者与请求的执行者之间消除耦合&#xff0c;让对象之间的调用关系更加灵活。在命令模…

聊聊零拷贝技术原理和应用

文章目录 0. 引言1. 什么是零拷贝技术 1. 零拷贝技术在不同领域的应用2.传统拷贝技术的缺点3. 零拷贝技术的原理与实现1. sendfile系统调用2. 内核缓冲区与用户缓冲区3. DMA&#xff08;Direct Memory Access&#xff09;技术4. 文件描述符传递与共享5. Direct I/O&#xff08;…