unity3d中网格mesh可以制作的吗怎么做的

unity3d中网格mesh可以制作的吗怎么做的,第1张

mesh一般是由3DMax,Maya,Blender等建模工具制作的。

也可以由代码生成,需要掌握OpenGL或者D3D绘制图形的基础知识。

参见官方手册了解更多信息:

>

大家好,作为博客开通后的第一篇技术类博文,我决定将前不久总结的一些关于如何在移动端开放大世界中高效渲染草海的心得做一下分享,内容比较多,主要是寻找和探讨阻碍我们实现目标的一些技术问题,以及整理应对思路。 

那么在开始正式分享前,大家可以先概略的了解下接下来的主要内容:

1)首先,也是比较基础的,我们得明确实现所谓的“移动端开放世界草海”会遇到哪些挑战,引出几个主要的问题点;

2)接下来,在明确问题的前提下,我会花比较多的篇幅,来和大家一起设计一套可行的方案。期间我们会讨论许多内容,诸如,如何定义一株草,如何存储信息,如何在适宜的地方偷工减料,如何安排任务,充分利用起CPU和GPU的并行能力等等。

3)紧接着,我会简单过一下接口设计,大家此时已经对渲染草海的实现原理有了基本认识,因此对接口内容也应当能更好的理解了。

4)再之后是分享的一些,在工程搭建中,个人感觉比较重要的技术细节和实现。当然,由于我自身经验的局限,所选的技术实现不一定最适合当下的应用场景,所以随时欢迎大家指正问题。

5)在分享的最后,是一个简短的Demo展示和性能比对。

我们要做的是 移动端的 开放世界超大地图 上的 可交互的 草海。有3个定语修饰一个名词“草海”,我觉得首要问题还是要明白草海到底是什么,然后再来给它添加新特性以满足各项要求。

真实世界草海的2个特点

听到“草海”这个词,大家能想到什么。。。就我而言,我想到了遍布山丘的牧草,连片的金**麦田,或者密布在岸边的芦苇。这些景象给我的一个宏观感受是一个词“连绵不绝”,是一种在空间上由近及远铺排开来的那种连绵起伏的感觉,我们换一种朴实的说法就是:草是“海量”的;另一种给我的感受也可以总结为一个词“浑然一体”,意思是在色彩感官上,草海是相对统一和规律的,而不是杂乱琐碎的,就是说构成草海的草的个体种类具有同质性。所以“海量”和“同质”是我对这类自然景观的一种概括或抽象。也是草海的两点“特质”,后续我们的许多工作都是基于这两项认知的。

数字世界草海面临的挑战

基于对现实中草海的认识,来到移动数字端,我们发现这个绘制“海量”植被需求的本身,就是主要挑战。细分一下,主要有2个方面:

第一个是 :草体本身的绘制压力,主要由CPU和GPU共同承担,可以预见,草的数量越多,代表草的几何面片数量自然越多,这样从CPU读取数据,预处理,合并上传GPU,再到渲染这套通用流程走下来,总耗时就越来越大了。

另一个是 :存储草海信息的压力,简言之就是如何正确的记录下每一株草的位置、朝向等独有信息,并在需要的时候高效的获得到。

我们举个例子,不妨以一张10公里见方的世界地图为例,假设每平米生长有10株草,那么光存位置信息,我们需要占用: 

10G就算是理论上限也已经很大了,何况不止一种草要处理。

综上所述,算起来压力大,存起来存不下,面对在移动端绘制海量草的需求,这就是我们需要面对的基本问题与挑战。

我们刚刚提到过,绘制大量构成草的几何形状是有压力的,如果不能从草的数量上下手,那么就只能简化模型网格了。

主流的草模型有2类,既 面片草 和 模型草 。

面片草 是做得比较极端的例子,在这种模式下,草的颜色和轮廓只是一张带有alpha通道的纹理,草的几何构成(或者叫Mesh)被简化为一张或若干张面片(一般是矩形的)。如左上方的示例图,运行时GPU会在这块面片底板上,将美术同学绘制的2D贴图贴合上去,通过开启透明测试(也叫Alpha Test),让贴图纹理中不是草的部分透明,留下草本体的影像,以达到在3D空间中,绘制草效果。

模型草 是另一种绘制流派,与面片草最主要的区别在于如何表现草的外轮廓,后者(也就是面片草)的轮廓是由美术同学在纹理上直接绘制出来的,而前者(模型草)则主要由模型网格本身来表现植被的轮廓。网格长成什么样子,草的形态就是什么样子。运行时GPU采样纹理,一般也只是简单的渐变色块。我们之前聊过,移动端草海中草的模型不能复杂,不然GPU受不了,所以这也限制了模型草的美术表现空间,我们常见的模型草样式是如上图右侧这般的长条状柳叶形态,就是这种限制的表现。

面片草优缺点:

    ->优点:绘制Mesh顶点少效率高,一片面片可以代表多株草,草的样式对美术发挥空间大(因为美术可以把草的纹理绘制得很复杂,却不用增加额外的GPU运行消耗),此外一般认为面片草在绘制密度较高,且较低矮的草丛时,效果不错。

    ->缺点:首先是依赖透明度测试,因为一些原因,这个开销在不少移动端设备上是相当昂贵的。其次每株草都在垂直于地面的2D平面上,近处观察和俯视效果都不佳,且受制于简陋的面片Mesh,无法做出复杂的动画,影响交互体验 

模型草优缺点:

    ->优点:3D模型的草,不论上下远近观察,效果都很稳定;可以作出较复杂,较自然的动画,交互性好;此外还有暗含的一点:可以不依赖透明度测试(或者说草模型的轮廓就是草的轮廓,无需进行透明度测试)

    ->缺点:相对面片草Mesh多,每株模型草,一般只能表现一根草体,想要复杂草体,就得多上更多的顶点 

综上,模型和面片各自都有优缺点,很多时候需要根据美术上的实际需求来权衡 ;在下面一篇博文中我会介绍草海信息的储存构思,之后再谈谈我对于绘制草海的技术选型(包括模型和面片草的选取)

Unity3D中的地形类似于Maya中使用置换贴图来变形高段数的多边形平面,其原理是自动创建一个中等多边形密度的mesh plane(多边形平面),然后指定一张16bit的灰阶图作为height map(高差图),并根据mesh各个顶点所对应的灰度数值沿着Y轴改变该顶点的高度,形成高低起伏的复杂地形。

Unity3D内置了一套简单的brush(笔刷)工具来方便用户对地形物体的编辑修改。

通过菜单 GameObject > 3D Object > Terrain 可以创建一个Terrain (地形)。

Terrain Settings是对Terrain整体的参数设置面板。

最上面的一排按钮分别用来对地形及植被进行“刷制”的工具面板切换,最右边的 Terrain Setting 面板是针对地形整体的设置,这里挑一些常用的重点的来讲:

按下鼠标左键开始提升地形高度,如果同时按住 shift 键,则降低地形高度直到0。

直接刷出特定高度,按住 shift 键获取某一点的高度。非常适合用来刷出非水平面高度的平整地形,比如山顶或山间的一块平整地面等等。同时如果场景中有水面,由于Terrain不能刷出水平面以下的地形(最低刷到水平面),可以首先将全部地形提升到一定高度,再将水域地形刷低。

相当于光滑笔刷工具

在地形表面上绘制贴图。

首先需要在Textures栏中点击 Edit Textures ,再选择 Add Texture 以添加一层贴图。

在这个“添加地形贴图”面板中我们可以设置一张颜色贴图和一张法线贴图,并指定贴图的重复度。如果检测出颜色贴图含有Alpha通道,就会将这个Alpha通道与作为光滑度的贴图,否则就会出现一个Smoothness参数供我们调节这一层表面的光滑度,此外还提供一个Metallic参数供我们调节这一层表面的金属颜色。

这里的贴图都需要处理成无缝贴图,否则场景中会出现明显的接缝。贴图不需要特别大,因为重复度会被设置得比较高,通常512或者1024分辨率的贴图就可以了。

第一层贴图会默认覆盖整个地形区域,从第二层(从左往右)开始,添加好贴图以后需要在地形上刷出该层贴图的出现范围。

需要编辑各层的贴图设置只需点击 Edit Textures > Edit Texture ,需要删除贴图层就点击 Edit Textures > Remove Texture 。

在地形上刷出树来。

按下鼠标左键开始刷树,按住 Shift 键再刷可以删除已经刷出来的树,按住 Ctrl 键再刷可以删除当前选择的特定类型的树。

在Trees栏点击 Edit Trees ,再选择 Add Tree ,可以添加一个GameObject作为“树”。这个物体可以是任意GameObject,并不一定非要是Tree Object。

然后就可以用鼠标在地形表面“刷”出这类树来了,同时也会出现具体的Settings参数。

我们可以添加多种type的树,然后一层层刷出复杂的森林结构。

同样的,我们也可以点击 Edit Trees > Edit Tree 给树更换GameObject,或点击 Edit Trees > Remove Tree 删除某一层的树。

在地形上刷出细节物体,通常用来做草。

按下鼠标左键开始刷细节物体,按住 Shift 键再刷可以删除已经刷出来的细节物体,按住 Ctrl 键再刷可以删除当前选择的特定类型的细节物体。

在Details栏点击 Edit Details ,再选择 Add Grass Texture ,打开Add Grass Texture面板设置新建“草贴图”的参数:

在Details栏点击 Edit Details ,再选择 Add Detail Mesh ,打开Add Detail Mesh面板设置新建“细节面片”的参数:

本文初衷是想仿照我的世界的泥土制作预制体,在使用贴图时意识到需要计算每个面的uv值来对应贴图中的具体坐标,但在网络上搜集资料后发现没有针对性的方案,这里笔者就最简洁的案例展示计算脚本及贴图的对应坐标。

    直接上图:

    对应脚本:

    

    将整张的长宽视为一个单位,九宫格内的坐标为均分后的值,而每个点可能代表两个uv的点,按照顺序为其赋值即可,注意贴图的上下左右顺序。

都可以的

一般是在max或maya里面编辑动作,然后导出

或者直接在unity3d里面调动作,原理和maxmaya一样就没那么专业好用

动作也不是一般人能做的

美工习惯工具是max和maya所以一般都是再maxmaya里面做好

然后再unity3d里面重新调一遍,可以添加动画事件关键帧等。

是。unity动态换mesh后,返回数组副本就需要重新开辟内存空间,每次访问都会有一次新的存储空间的开辟,顶点越多,访问的次数也就越多,而且每次开辟的空间也会越大,导致性能变慢。《unity》是实现动态资源加载的软件,mesh是指无线网格网络。

导航

博客园

首页

联系

管理

< 2022年12月 >

日 一 二 三 四 五 六

27 28 29 30 1 2 3

4 5 6 7 8 9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30 31

1 2 3 4 5 6 7

统计

随笔 - 278

文章 - 3

评论 - 14

阅读 - 37万

公告

昵称: slqt

园龄: 12年2个月

粉丝: 21

关注: 10

+加关注

搜索

常用链接

我的随笔

我的评论

我的参与

最新评论

我的标签

最新随笔

1命令行开启wsl并安装调试python项目

2Pylint在Windows上的安装

3pylint配置

4清除指定名称的进程

5从bug维度分析质量的方法

6查找指定目录下最新文件,以及以固定格式开头的文件

7jenkins获取任务信息

8jenkins分布式部署方案

9获取sonar7版本的代码扫描数据

10发送带附件的邮件

我的标签

saltstack(1)

云主机(1)

积分与排名

积分 - 274276

排名 - 3199

随笔分类 (20)

Django(4)

kali(2)

python灰客(2)

saltstack(1)

selenium(2)

测试(3)

黑客(4)

云主机(2)

随笔档案 (278)

2021年3月(1)

2021年2月(2)

2021年1月(2)

2020年12月(1)

2020年10月(1)

2020年9月(8)

2020年8月(1)

2020年7月(4)

2019年12月(3)

2019年11月(1)

2019年10月(2)

2019年9月(3)

2019年8月(8)

2019年7月(6)

2019年6月(5)

更多

常用链接

搜索

多邪教主的wiki

某朋友的git博客

阅读排行榜

1 ESXI常用命令(27068)

2 解决python发送multipart/form-data请求上传文件的问题(16128)

3 python模块介绍- binascii:二进制和ASCII互转以及其他进制转换(13061)

4 DES加密模式详解(11574)

5 windows命令行获取时间(11077)

评论排行榜

1 windows使用python原生组件包获取系统日志信息(6)

2 vmware克隆虚拟机并设置网络(vcenter6或55)(3)

3 centos7版本设置OS启动默认进入图形界面还是文本界面(2)

4 如何解决OpenStack创建虚拟机或删除虚拟机时一直处于deleting或者creating状态的问题(转载)(2)

5 Unity打包PC端各种屏幕适配,无边框,最小化,显示可拖拽部分(1)

推荐排行榜

1 vmware克隆虚拟机并设置网络(vcenter6或55)(2)

2 DES加密模式详解(2)

3 git使用命令行自动登录(1)

4 Nginx心跳检测(1)

5 windows命令行获取时间(1)

最新评论

1 Re:vmware克隆虚拟机并设置网络(vcenter6或55)

大佬给个示例 指点一下谢谢

--一毛丶丶

2 Re:vmware克隆虚拟机并设置网络(vcenter6或55)

@一毛丶丶 支持,但是模板和读取格式略有不同

--slqt

3 Re:vmware克隆虚拟机并设置网络(vcenter6或55)

vCenter 7的配置虚拟机IP地址不支持指定IP了么

--一毛丶丶

4 Re:Unity打包PC端各种屏幕适配,无边框,最小化,显示可拖拽部分

pc嵌入unity 无边框启动unity的exe 会更改pc软件的窗口 请问有什么解决思路吗,感谢

--芝麻粒儿

5 Re:windows使用python原生组件包获取系统日志信息

@ time()这个是我自己写的模块,run_cmd其实就是subprocess的封装,你可以自己实现,data_format 其实就是python的format函数的封装,可以自己实现

--slqt

Unity3D动态生成多边形

来自>

以上就是关于unity3d中网格mesh可以制作的吗怎么做的全部的内容,包括:unity3d中网格mesh可以制作的吗怎么做的、unity 怎么通过取出的navmesh 数据.重新绘制寻路网格、Unity挑战大世界刷草(一)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9503740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存