unity rawimage3d。raw导入后生成的地形是一片一片的,小伙伴们求救啊!

Unity3D – ZeroYangunity3d地形生成_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
unity3d地形生成
&&本文介绍如何使用unity3d的地形器,比较专业
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢谢邀。&br&&br&其实题主自己已经知道如何做了,想要有效的从临摹中学习动漫插画,的确就是要解决&b&画啥,为什么而画,怎么来搜集并临摹&/b&这三点……以下是一些很废话的再次总结,希望对您有帮助。&br&&b&==========================================&/b&&br&&br&&b&1.不知道最近该画点啥好?&/b&&br&&br&我常说的就是列单子,收集你之前画过的画,找出不足,一样样列出并执行计划。&br&常见的问题有:&b&人体、场景、情节&/b&。&br&&br&&b&人物&/b&:&b&必备基础类&/b&《伯里曼》、《艺用人体结构教学》、《伯恩动漫专业人体结构教学》&br&&b&
辅助照片类&/b&《艺用人体透视图集》、《艺用人体造型图集》系列&br&
另外推荐的有《Figure Drawing》、《彰显生命力》(待补充)&br&
若想进行&b&数码绘画&/b&,可参考的软件有:DesignDoll、Pose Studio等。&br&====================================================&br&&b&场景&/b&:&b&教材类&/b&推荐《动画背景绘制基础》、《建筑画环境表现与技法》、《建筑速写心得》&br&&br&&b&
实践类:买照片,自己拍素材&/b&。&br&&br&&br&&b&
参考类&/b&推荐google地图……不说笑,使用方法请看下图:&br&
打开google地图后,输入著名景点,查看卫星图片,善用参考不算侵权。&br&&img src=&/c108977fdf01daceb86d26a92ff49067_b.jpg& data-rawwidth=&1905& data-rawheight=&860& class=&origin_image zh-lightbox-thumb& width=&1905& data-original=&/c108977fdf01daceb86d26a92ff49067_r.jpg&&&br&
还有这个360°城市&a href=&///?target=http%3A///tokyo-gigapixel-roppongi-hills-mori-tower/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tokyo Roppongi Hills 45-gigapixel panorama photo&i class=&icon-external&&&/i&&/a&&br&
使用方法请自行摸索&br&&img src=&/aa4bd14ecd59ca47469b72_b.jpg& data-rawwidth=&1593& data-rawheight=&742& class=&origin_image zh-lightbox-thumb& width=&1593& data-original=&/aa4bd14ecd59ca47469b72_r.jpg&&&br&&img src=&/4ddbb101304a_b.jpg& data-rawwidth=&1468& data-rawheight=&579& class=&origin_image zh-lightbox-thumb& width=&1468& data-original=&/4ddbb101304a_r.jpg&&&br&&br&&br&============================================&br&&b&情节:&/b&请合理&b&使用实词词典&/b&,每日任意抽取若干词,自行组合成情节或画面,然后发挥想象力,画。&br&
平时可以整理一下报纸或者身边的故事,稍作改编(不建议直接使用网上听来的故事,可能
会造成侵权)&br&&b&======================================&/b&&br&&b&2.不会收集素材?&/b&&br&&br&常见素材搜集方法:各类资源分享型&b&微博&/b&,首推老阿姨在看着你、爬藤家等。&br&&br&
各类资源分享型&b&网站&/b&,&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[CG Textures]&i class=&icon-external&&&/i&&/a&
(个人习惯乱收集,所以没整理网站,往后可能补充)&br&&b&
贴吧、P站、百度图片&/b&,自行查找,注意规范使用,别擅自发在网上。&br&&b&======================================&/b&&br&&b&3.临摹没有方向性?&/b&&br&&br&&br&解决方法:①和第一点一样,找问题,列清单,解决。&br&&br&
②找自己喜欢的画家、画手,找自己喜欢的绘画风格,朝着他们列出解决清单,勇往直前即可,注意不要迷失自我。 &br&&br&&b&=======================================&/b&&br&回答完毕,希望对您有帮助。
谢邀。 其实题主自己已经知道如何做了,想要有效的从临摹中学习动漫插画,的确就是要解决画啥,为什么而画,怎么来搜集并临摹这三点……以下是一些很废话的再次总结,希望对您有帮助。 ========================================== 1.不知道最近该画点啥好?…
&p&微软的Sysinternals系统管理工具包。里面有几十个小工具,用来检测和管理Windows。免费可下载。我最常用的有两个:&/p&&p&autoruns:用来管理开机自启动的程序。众所周知流氓软件有多种方法可以开机自启动。autoruns把各种形式的开机自启动项目都汇总起来了,流氓软件无处藏身。&/p&&img src=&/v2-9a7c8f1b3bb37b9d45bed_b.png& data-rawwidth=&400& data-rawheight=&272& class=&content_image& width=&400&&&br&&p&procexp:加强版的任务管理器。流氓软件弹窗?你可以用它查出每个窗口分别对应的进程名字,进而找到流氓软件进程的exe路径,然后删除之。文档被某个进程锁住了无法删除,你可以用它查到是哪个进程锁的,等等。&/p&&img src=&/8e2fdee1ad0ab950fd3b7335_b.jpg& data-rawwidth=&420& data-rawheight=&260& class=&content_image& width=&420&&&p&我对它最大的不满是,它居然不是Windows内置的。&/p&&p&下载地址:&a href=&///?target=https%3A///en-us/sysinternals/bb842062& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sysinternals Suite&i class=&icon-external&&&/i&&/a&&/p&
微软的Sysinternals系统管理工具包。里面有几十个小工具,用来检测和管理Windows。免费可下载。我最常用的有两个:autoruns:用来管理开机自启动的程序。众所周知流氓软件有多种方法可以开机自启动。autoruns把各种形式的开机自启动项目都汇总起来了,流氓…
&img src=&/50/v2-1d7bd693de5dca1a03fbd_b.jpg& data-rawwidth=&700& data-rawheight=&496& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/50/v2-1d7bd693de5dca1a03fbd_r.jpg&&往往,我们在编程过程中都会碰到一些错误,从而造成一连串的反应,这里,汇总了7大程序员最容易犯的错误,与大家共勉!&img src=&/v2-76d22eb2a70fd0c27d324efe40c82244_b.jpg& data-rawwidth=&681& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&681& data-original=&/v2-76d22eb2a70fd0c27d324efe40c82244_r.jpg&&&p&1.没有明确的目标&/p&&p&心中没有终点目标,那就只会随波逐流。&/p&&p&如果你想在软件开发的职业生涯上获得成功,那么你需要有一个明确的目标。&/p&&p&仅仅只是对遥远的未来有一个模糊的想法是不够的。&/p&&p&相反,你应该有坚实的目标——在某个时间段内的首要目的——明确定义的目标。&/p&&p&我认识许多程序员和所谓的专业人士庸庸碌碌地在同一个岗位上干了几十年,是的,你没听错,就是几十年!&/p&&p&这是一场悲剧,但如果没有目标,这就是你人生的默认选择。&/p&&p&请引以为戒,否则下一个悲剧就会是你。&/p&&p&那么,我们能做些什么呢?&/p&&p&从今天开始,从现在开始,花一些时间,好好想想你的编程生涯,并决定自己的近期目标。&/p&&p&我的意思是,明确当前的首要目标。&/p&&p&一旦达到这个目标之后,再制定一个新的目标,但是现在,请好好想想,你的编程生涯需要实现什么目的?&/p&&p&你可以记下来,放到每天都能看到的位置,来提醒自己不断地朝着目标前进。&img src=&/v2-2f9d90c23ab8b8f2373423_b.jpg& data-rawwidth=&600& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-2f9d90c23ab8b8f2373423_r.jpg&&&/p&&h2&2.不投资于非技术和“软技能”&br&&/h2&&p&我认识很多程序员其实真的很擅长于写代码。&/p&&p&我也认识很多程序员在算法上确实远远优于我。他们理解和思考复杂架构的水平,是我所望尘莫及的。&/p&&p&但你猜怎么着?&/p&&p&在我的软件开发职业生涯中,我超越了他们,不仅包括职位职务,还有工资,工作效率,性能等等。&/p&&p&我说出来不是为了炫耀,只是想要说明软技能对我们的编程生涯有多重要,而不仅仅是那些大多数程序员重点关注的技术技能。&/p&&p&作为一个软件开发人员,你肯定知道,你的工作并不仅仅是编写代码。&/p&&p&还有其他许多必要的重点技能。&/p&&p&我们得时常与人打交道,所以人际交往能力是必须的。&/p&&p&紧张的时间期限,快速的变化则需要稳定的心理,能够全神贯注,并懂得自我激励。&/p&&p&在一个不断变化的环境中,在一个充斥了各种繁多和意外的环境中,我们要学会如何优先安排,并尽可能地富有成效。&/p&&p&此外我们也不能忽略健康以及经济因素,如果忽略它们的话也同样会导致失败甚至是毁灭。&/p&&p&相关方面的内容还有很多,我就不一一赘述了,感兴趣的话,可以阅读《Soft Skills: The Software Developer’s Manual》 做深入的了解。&/p&&p&总而言之,不管你做的是哪方面的工作,软技能几乎总是比硬技能、技术技能更重要——所以一定要好好学习这方面的知识。&img src=&/v2-fb13b4dc387b6e878de6ad117b767464_b.jpg& data-rawwidth=&4095& data-rawheight=&2895& class=&origin_image zh-lightbox-thumb& width=&4095& data-original=&/v2-fb13b4dc387b6e878de6ad117b767464_r.jpg&&&/p&&h2&3.不参与社区&br&&/h2&&p&我做的其中一件让我的编程生涯受益无穷的事就是,参与社区。&/p&&p&这不但让我有了归属感,不再感觉孤单,还能帮助我提高技能,敢于设定更高的目标。&/p&&p&所以,我强烈建议你加入到编程社区中。&/p&&p&众人拾柴火焰高,参与社区,是一种积极的成长方式。&/p&&p&如果你发现自己的软件开发职业生涯停滞不前,那么加入社区吧,里面的一些志同道合之人会为你提供助你克服困难,冲出困境的种种建议。&/p&&p&成为社区的一份子,还可以让你获得关注,增加知名度,这将会大大有利于你的事业发展。&/p&&p&那么,怎么加入社区呢?&/p&&p&这很简单。世界各地都有这一类的团体,你可以简单地加入一个并参加聚会。&/p&&p&比如说,你可以加入一年一次的,免费的,当地的Code Camp活动,那时许多软件开发人员会聚集到一起分享他们的工作心得。并且通常任何人都可以报名发表他们想要谈论的话题。&/p&&p&如果你不喜欢这种聚会方式,也可以加入虚拟社区。&/p&&p&对于初学者来说,不妨加入码农社区。社区里面提供技术开发交流,也有很多资讯和信息,非常不错。&/p&&p&你也可以写博客,这也是参与社区的一种方式。&/p&&p&话说,就是博客让我在社区众多程序员中脱颖而出的。&img src=&/v2-b6b4c5fb5bd41b8a62e9853_b.jpg& data-rawwidth=&1680& data-rawheight=&1050& class=&origin_image zh-lightbox-thumb& width=&1680& data-original=&/v2-b6b4c5fb5bd41b8a62e9853_r.jpg&&&/p&&h2&4.不专业&br&&/h2&&p&如果你曾经看过我写的博客,或者读过我的书,你就会发现我几乎每次都会提到这个话题,因为它真的非常重要。&/p&&p&专业化。&/p&&p&为自己选定一个方向,然后专心致志地朝着这个方向发展。&/p&&p&但这并不意味着你无需具备广泛的知识基础——我非常热衷于通晓多门编程语言——我的意思是,你应该选择某个区域,然后孜孜不倦一心一意于挖掘更深层次的内容。&/p&&p&成为某种形式的专业人士是非常重要的,尤其是职业生涯的早期。&/p&&p&专业人士的需求高,所以他们拿到的薪资也高,并且通常而言,他们还能够更快地塑造起威望来。&/p&&p&另外,如果你的老板知道你在软件开发领域和技术上面钻研得很深,肯定会对此非常开心。&/p&&p&你应该成为小池塘中的大鱼,而不是大池塘中的小鱼。&/p&&p&或许最终你会因为个头太大而不再适合这个池塘——那个时候你可以大胆潜入到更深的水域——但是,以一个专业人士的身份开启你的软件开发生涯,可以在这一行中为你自己树立个人品牌和声誉。(关于这一点,下面我会详细说明。)&/p&&p&最后,不要担心自己专业化了之后会被对号入座——这种事很少发生。&/p&&p&并且,你也不需要真的研究得太深。话说,这么多年,我也没碰到有谁是太过于专业化的。&img src=&/v2-98e9ba74f05ac_b.png& data-rawwidth=&1240& data-rawheight=&877& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&/v2-98e9ba74f05ac_r.png&&&/p&&h2&5.不投资于个人品牌&br&&/h2&&p&生活中的许多事情来来去去,犹如过往云烟。你可能会换工作,又或许甚至要换配偶;突然一夜暴富,也可能穷困潦倒;可能身体很健康,但也有可能会发胖——但无论生活中发生什么,有一样东西会永远与你同在……&/p&&p&你的名字。&/p&&p&所以,既然你的名字将贯穿你的一生,为什么不在这上面花些精力呢?&/p&&p&你的名字,或者说你的个人品牌,是非常宝贵的财富,也是许多软件开发人员没有意识到的财富。&/p&&p&你的名字,或者说你的个人品牌,是你找工作、升职、挖掘潜在客户、甚至是自己创业的强大工具。&/p&&p&哪怕你的名字从字面上看并不与众不同,但只要你有良好的知名度和声誉,那么有时候搞定诸多麻烦只是举手之劳而已。&/p&&p&我认识很多的软件开发人员因为已经具备了坚实的个人品牌,所以再也不必担心就业问题。因为无论发生什么事,他们都有把握找到另一份工作,因为他们的声誉众所周知。&/p&&p&我们都听说过推销产品和服务,但你可曾想过推销自己?&/p&&p&想在软件开发行业打造个人品牌,我的建议是写博客,选择一个特定的领域或专业,然后做到让你的名字如雷贯耳就行了。&/p&&p&最好办法之一就是写一些对其他人有用的内容。&/p&&p&就拿博客举例。我写的博客可以在互联网上构建了我的品牌和声誉。如果你觉得这篇文章,甚至是我的网站有价值,那么你可能会分享。也可能会为此页添加书签,或者订阅相关邮件,这样你就不会错过任何好的资讯。&/p&&p&这只是打造个人品牌的方式之一。&/p&&p&你还可以创建YouTube视频,发表自己的播客,写文章写书,在活动中发言。&/p&&p&但这并不意味着你必须做上述所有这些事情,这只是我认为不错的一些点子而已。&img src=&/v2-3cfbb060b37a6bc3f20ba7_b.jpg& data-rawwidth=&600& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-3cfbb060b37a6bc3f20ba7_r.jpg&&&/p&&h2&6.不搞点业余项目&br&&/h2&&p&我们手头应该总是有个业务项目在做。&/p&&p&业余项目有很多你可能不知道的有益之处。&/p&&p&首先,业余项目是改善技能的有效方式。并且,这远远比你朝九晚五的工作能更快地提升你的成长速度。&/p&&p&开发业余项目也是学习新技能新技术的好方法,有助于你寻找新工作。常常有很多程序员抱怨说现在千篇一律的工作没法让他们学习新技术,使得他们跟不上市场的脚步。听到这样的话,我总是劝他们不妨试着用心仪的新技术去开发业余项目,这绝对是个学习相关技能的好办法。&/p&&p&而且,业余项目还可以让你赚点外快。&/p&&p&可能你一开始不会想着用业余项目赚钱,但是业余项目的确是能让你获取额外的收入。&/p&&p&我大概在4年前开始开发Android和iOS app作为我的业余项目,并且至今它们依然在为我创造财富。&/p&&p&我也认识不少软件开发人员最终将业余项目当作了他们的全职工作。&/p&&p&开发业务项目其实很有趣。&/p&&p&当你工作累了厌了,写一会自己喜欢的业余项目能很好地消除疲劳和压力。并且业余项目也是一个很好的出路,也许哪一天让你赚了大钱呢。&img src=&/v2-b7b53d9b36dd5f2dbdae7_b.jpg& data-rawwidth=&600& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-b7b53d9b36dd5f2dbdae7_r.jpg&&&/p&&h2&7.没有自我教育的规划&br&&/h2&&p&每次我面试软件开发人员时,问的第一个问题往往是关于他们自我教育和自我完善的规划。&/p&&p&有没有去做点什么以便让自己成长得更为优秀呢?&/p&&p&我经常会问他们用什么措施来跟上总是在不断变化的领域。&/p&&p&我经常会问他们最近读了什么书,以及哪些是他们认为值得推荐给所有软件开发人员阅读的好书。&/p&&p&我想从他们的答案中知道他们是否有一个用于自我教育,用于不断成长的确切规划。我之所以这么做是因为我知道一个致力于不断自我完善的人不仅会成就自己,也能带动周围的人一起朝着成功前行。&/p&&p&然而,很可惜的是,很多程序员都没有任何形式的自我教育规划。&/p&&p&如果你还没有用于学习和提升自我技能的规划,那么是时候为自己制定一个了。&/p&&p&想听听我推荐的一个简单规划吗?&/p&&p&保证每个月阅读一本技术或职业发展类的书籍。&/p&&p&一年下来你就能累计阅读12本。&/p&&p&我个人的话,每天至少投入45分钟到阅读上。&/p&&p&请记住,千里之行始于足下。哪怕一天30分钟,持续一两年之后,就能给你带来巨大的改变。&/p&&p&行动吧,骚年&/p&&p&希望这篇文章列举的这7个错误能警示各位,但是,如果你不采取任何行动,那么即使是灵丹妙药,也不会有一丝作用。&/p&&p&所以,阅读完了之后,不要抛之脑后,请从今天就开始行动。&/p&&p&先将定为至少改正自己已知的一个错误。&/p&&p&欢迎留下评论以及分享你的成果。&/p&&p&真正的勇士,敢于直面自己的不足之处,然后积极改正它们!&/p&&br&&p&3月23号补:这才几天不见,一登录账号,看到头上的数字实在是吓一跳,为了避免误会,我还是将转载的地址发给大家吧,因为,当初我也是在一微信上看到的这篇有意义的文章,所以就随便发上去了单纯的分享,并没有预料到会有这种情况,给大家造成误解,真的抱歉呀,我转载的原地址是一个叫Java世界观的某平台公众号:&a href=&/?target=https%3A//mp./s%3F__biz%3DMzU3MzAwNDQ3Ng%3D%3D%26tempkey%3D9vcmzS%252BUy9NDqh48Se8DDIq4k8oohPJ0aUU0IF63CEFsbz5Q2EoAuBy1ooHCANHF6ruJpgK%252Byb%252BuOX5n7WFIAE8P0SYdk6mdh3%252BsEphw2WNCSNPFGw38SPRqLpdZazYWhioRKzWvMoZIrjXEfVKnyQ%253D%253D%26chksm%3D7cc90eab4bbe87bdff4c55b42bdf04befe3425cbe2f004dfbd6d7f3d8c7b26e5e5%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序员编程生涯中会犯的7个错误&i class=&icon-external&&&/i&&/a&&/p&
往往,我们在编程过程中都会碰到一些错误,从而造成一连串的反应,这里,汇总了7大程序员最容易犯的错误,与大家共勉!1.没有明确的目标心中没有终点目标,那就只会随波逐流。如果你想在软件开发的职业生涯上获得成功,那么你需要有一个明确的目标。仅仅只…
&img src=&/50/v2-8577615dcffd_b.png& data-rawwidth=&631& data-rawheight=&336& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/50/v2-8577615dcffd_r.png&&&p&首先,估计所有让顶点随时间动起来的机制能都被称作顶点动画。然后接下去可以分为了蒙皮动画(Skin)和变形动画(Morph Target / Blend Shape)。其中&b&变形动画&/b&最近有被排挤到只用来做脸部表情的趋势,让人实为不解。所以收集了下资料也动手试了试,虽然可能技术角度来看工具或者引擎的支持力度都还达不到对美术朋友友善的程度,不过也完全没有到只能放弃的程度。&br&&/p&&h2&尝试&/h2&&p&虽说是动手试,也只是把UE4自带的功能尝试的搬到Unity里,顺带窥视下里面的部分细节。&br&UE4相关文档在这里:&br&&a href=&/?target=https%3A///latest/INT/Engine/Animation/Tools/VertexAnimationTool/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vertex Animation Tool&i class=&icon-external&&&/i&&/a&&br&&a href=&/?target=https%3A///latest/INT/Engine/Animation/Tools/VertexAnimationTool/VAT_TL_Meshes/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vertex Animation Tool - Timeline Meshes&i class=&icon-external&&&/i&&/a&&br&&/p&&p&从原理出发,变形动画就是暴力地将顶点每一帧的数据都存起来,储存与读取的方法多种多样,这里主要关注用贴图来储存顶点数据的方法。&/p&&p&最单纯的例子就是,M个顶点在N帧里面的位置信息,那么就可以用一张MxN大小的贴图来保存。&br&贴图的每个Texel(贴图和纹素的 好像不搭...)保存了位置信息(XYZ =& RGB)。运行时读出这张贴图来就可以获取顶点在某一帧的位置信息了。而生成这张贴图的工序自然需要在建模工具里完成,可以概括理解为将模型的动画Bake到一张贴图里去。&br&&img src=&/v2-0afa15cff53b_b.png& data-rawwidth=&529& data-rawheight=&35& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&/v2-0afa15cff53b_r.png&&&/p&&p&贴图的制作部分主要用了上面文档里介绍的UE4自带Max插件VertexAnimationTools.ms。文档里导出导入方面也解释得很详尽,这里就不再重复了。导入Unity也是基本上丢进文件夹就行。主要总结一下几个重要的细节。&/p&&ol&&li&&b&感谢评论里&a href=&/people/foxhuntd& class=&internal&&FOXhunt&/a&和&a href=&/people/avatarye& class=&internal&&Avatar Ye&/a&的详细讲解!这些经验之谈可以让人少走不少弯路。&/b&&/li&&li&Unity的话Shader怎么写? 当然是抄UE的就行!(人肉转换器2333)&br&&div class=&highlight&&&pre&&code class=&language-glsl&&&span&&/span&&span class=&c1&&// 知乎的语法高亮有用吗....&/span&
&span class=&n&&v2f&/span& &span class=&n&&vert&/span& &span class=&p&&(&/span&&span class=&n&&appdata&/span& &span class=&n&&v&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&v2f&/span& &span class=&n&&o&/span&&span class=&p&&;&/span&
&span class=&k&&float&/span& &span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&_Time&/span& &span class=&o&&*&/span& &span class=&n&&_VertexAnimationSpeed&/span&&span class=&p&&;&/span&
&span class=&c1&&// 时间为u轴,顶点Index为v轴,组成uv&/span&
&span class=&c1&&// 其中顶点Index来自uv1,定义是 float2 uv1 : TEXCOORD1;&/span&
&span class=&n&&float4&/span& &span class=&n&&uv&/span& &span class=&o&&=&/span& &span class=&n&&float4&/span&&span class=&p&&(&/span&&span class=&n&&v&/span&&span class=&p&&.&/span&&span class=&n&&uv1&/span&&span class=&p&&.&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&mo&&0&/span&&span class=&p&&,&/span& &span class=&mo&&0&/span&&span class=&p&&);&/span&
&span class=&c1&&// 因为是在VertexShader中采样,没有自动lod可以用,所以要指定lod = uv.w = 0。 不太清楚cg里面有没有Load...&/span&
&span class=&n&&float4&/span& &span class=&n&&offset&/span& &span class=&o&&=&/span& &span class=&n&&tex2Dlod&/span&&span class=&p&&(&/span&&span class=&n&&_VertexAnimationTex&/span&&span class=&p&&,&/span& &span class=&n&&uv&/span&&span class=&p&&);&/span&
&span class=&c1&&// 因为导出的偏移是在物体自身坐标系内的,所以是直接对顶点数据进行操作&/span&
&span class=&c1&&// 加了一对Offset和Scale来做Remap&/span&
&span class=&n&&v&/span&&span class=&p&&.&/span&&span class=&n&&vertex&/span&&span class=&p&&.&/span&&span class=&n&&xyz&/span& &span class=&o&&=&/span& &span class=&n&&v&/span&&span class=&p&&.&/span&&span class=&n&&vertex&/span&&span class=&p&&.&/span&&span class=&n&&xyz&/span& &span class=&o&&+&/span& &span class=&p&&(&/span&&span class=&n&&offset&/span&&span class=&p&&.&/span&&span class=&n&&xyz&/span& &span class=&o&&*&/span& &span class=&n&&_VertexAnimationScale&/span& &span class=&o&&+&/span& &span class=&n&&_VertexAnimationOffset&/span&&span class=&p&&);&/span&
&span class=&n&&o&/span&&span class=&p&&.&/span&&span class=&n&&vertex&/span& &span class=&o&&=&/span& &span class=&n&&UnityObjectToClipPos&/span&&span class=&p&&(&/span&&span class=&n&&v&/span&&span class=&p&&.&/span&&span class=&n&&vertex&/span&&span class=&p&&);&/span&
&span class=&c1&&// 方便确认作为颜色传出去,结果就是题图那样&/span&
&span class=&n&&o&/span&&span class=&p&&.&/span&&span class=&n&&color&/span& &span class=&o&&=&/span& &span class=&n&&offset&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span& &span class=&n&&o&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&/li&&li&顶点Index?&br&为了知道当前处理的是哪个顶点,UE4的Max脚本把顶点Index写进了UV1里面,然后就可以在Shader里面直接取得了,因为UE4貌似也没有转为这个开个Channel出来,所以还特意强调了Use Full Precision UVs,实际所需的精度主要还是看顶点个数。最开始自己也妄想过用SV_VertexID来代替,但是这得保证顶点排列严格一直,在现代引擎里一不小心就被优化了...&/li&&li&位置以外有哪些信息需要更新?&br&首先位置变了Normal肯定得更新,像UE4那样Normal再导出张图可以解决。当然Tangent也得实时更新了。另外基本都不会受什么影响。&/li&&li&&p&贴图的精度?&br&详细见评论。自己动手试了下确实如大佬们所说不需要EXR。&br&但是8Bit还是容易产生不稳定的输出,时间轴上加个平滑可以让结果安定不少。&/p&&/li&&li&UE4只有Max的脚本,其他工具呢?&br&可能是用的不太多,好像没有比较好的支持。&br&但是Max的也只有一个.ms,所以可以扒出来各种设定重新做一个。&br&Unity这边干脆就没有了。只找到下面这个下过来要修点东西才能运行的...&br&&a href=&/?target=http%3A///r/1d7/unity-vertex-texture-fetch-animation& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity Vertex Texture Fetch Animation - Unity List&i class=&icon-external&&&/i&&/a& (看了下其实也不算复杂)&br&不过Unity的特长在AssetStore上,有&a href=&/?target=https%3A//www./en/%23%21/content/644& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MegaFiers&i class=&icon-external&&&/i&&/a&这种全能型的东西。&br&然后就是评论里大佬们自己动手搞的系统了,也许不久的将来各个引擎都标配类似的pipeline也不是不可能...(毕竟TA们都太会玩)&/li&&li&实现细节(动手写了才后知后觉)&br&介于上面这些实在是不好用,参考着自己写了个Maxscript,丢&a href=&/?target=https%3A///silvesthu/bef6ef6b1e25& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gist&i class=&icon-external&&&/i&&/a&上了。配合上面的Unity Shader基本可以还原Max里面的效果,当然优化什么的还完全没有考虑。&br&真正用起来,因为直接存了偏移(位置)信息,坐标系以及单位长度的变换也是必须考虑的。Remap用的信息怎么导出去也是个问题。顺便茶杯那个例子加了简易的Remap大概是下面这样。&/li&&/ol&&br&&h2&&img src=&/v2-25d065b73f617bf1cc43ea_b.jpg& data-rawwidth=&530& data-rawheight=&64& class=&origin_image zh-lightbox-thumb& width=&530& data-original=&/v2-25d065b73f617bf1cc43ea_r.jpg&&限制&/h2&&ul&&li&耗内存,或者反过来说限制了顶点数量和动画帧数都不能太高。&br&帧数其实一般还好,关键帧少的话会比较浪费。可以搞个带插值的变种解决。&br&顶点数就比较容易爆炸了,超了4096的贴图大小估计引擎(和QA)就不干了。&br&&/li&&li&要重新计算Normal的话开销更大。&br&然而现在都搞光照了Normal又缺不了....&/li&&li&没有好用的工具。&br&UE4虽然有现成的,就MaterialEditor里面那带着诡异名字的Node还远远称不上好用。&/li&&/ul&&h2&GDC2017更新&/h2&&ul&&li&Naughty dog基本拿了同一个Slide又出来讲了一遍&/li&&li&343有个Session讲了Geometry Caching Framework也炒鸡棒(基本就是Alembic Cache)&br&程序员和美术解决问题的方法的区别就这么体现出来了23333&br&&/li&&li&Houdini16加入了正式的支持,除了Uncharted里面已经用的,也有支持Topo变化的,甚至流体什么的,应用范围来看也跟Geometry Caching挺像的&/li&&li&[2017年5月] &a href=&/?target=https%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& GDC上Houdini演示用的资源公开了。粗略看了下并没有什么特别的地方,有个Mantra节点可以直接输出为图片。主要还是适配了Houdini里面的RIGID, SOFT, FLUID, SPRITE。&/li&&/ul&&br&&h2&脑洞(然而人家已经做出来了。。。)&/h2&&ul&&li&配合Pivot-based Animation使用。包括下面的Uncharted4,在植物类的动态表现里已经被广泛使用,那么不直接储存顶点位置(或偏移),而是相对Pivot的Transform的话,便可以以更低精度的数据来表现特定的动画了。&/li&&li&可以只存一个中心点,或者一条中心线作为Path,在Shader里做路径动画之类?虽然不能自由的实现变形了,但可以忽略顶点数量,贴图也小了。(虽然正常引擎会在Effect部分带有类似功能,世上总是渣引擎多)再回头一想好像跟评论里说的FFD是一个思路。&/li&&/ul&&br&&h2&应用&/h2&&a href=&/?target=http%3A///other/2016/naughty_dog/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Technical Art of Uncharted 4&i class=&icon-external&&&/i&&/a&&br&&a href=&/?target=https%3A///community/fx-adventures-in-uncharted-4-a-thiefs-end/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&FX Adventures in Uncharted 4: A Thief's End&i class=&icon-external&&&/i&&/a&&br&里面称为Key Frame Animation,鸟,远景的人群都可以用到。&br&对于需要大量显示且顶点数量极少的东西来说,采样一张贴图远比更新骨骼动画划算多了。&br&&img src=&/v2-afc6fb3b1ea94eee0f9279_b.png& data-rawwidth=&637& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&637& data-original=&/v2-afc6fb3b1ea94eee0f9279_r.png&&&img src=&/v2-975e478bdab39d3352576_b.png& data-rawwidth=&638& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&638& data-original=&/v2-975e478bdab39d3352576_r.png&&&img src=&/v2-5e8aac7bd_b.jpg& data-rawwidth=&1922& data-rawheight=&1068& class=&origin_image zh-lightbox-thumb& width=&1922& data-original=&/v2-5e8aac7bd_r.jpg&&
首先,估计所有让顶点随时间动起来的机制能都被称作顶点动画。然后接下去可以分为了蒙皮动画(Skin)和变形动画(Morph Target / Blend Shape)。其中变形动画最近有被排挤到只用来做脸部表情的趋势,让人实为不解。所以收集了下资料也动手试了试,虽然可能技术…
&img src=&/50/v2-fdc5c458ddbd0_b.png& data-rawwidth=&872& data-rawheight=&456& class=&origin_image zh-lightbox-thumb& width=&872& data-original=&/50/v2-fdc5c458ddbd0_r.png&&提到游戏使用的实时渲染,很多人都会觉得光栅化渲染是唯一的方法,而想要在游戏中使用实时的光线追踪,似乎还是遥远的梦想。&br&&p&
虽然整体的光线追踪实时渲染架构以及相关硬件还在试验阶段,但从2016GDC的技术展示来看,游戏开发者在实践中已经找到了不少能利用现有架构实现光线追踪的小技巧,光线追踪技术已经悄悄地开始在游戏开发中发挥作用了。&/p&&p&
光线追踪的优点自不用说,容易理解、实现简单、支持体积渲染,况且还有shadertoy上那么多使用光线追踪制作的眩目效果。但问题是光线追踪和现有的游戏引擎架构不统一,而且实时运行的效率不高,如果要做体积渲染还存在如何存储和采样体积数据的问题。&br&&/p&&img src=&/50/v2-fdc5c458ddbd0_b.png& data-rawwidth=&872& data-rawheight=&456& class=&origin_image zh-lightbox-thumb& width=&872& data-original=&/50/v2-fdc5c458ddbd0_r.png&&&p&
下面的内容会介绍一些在现有游戏引擎里针对这些问题解决方案。&/p&&h2&&b&减少计算量&/b&&/h2&&p&
首先光线追踪在实时运行时最大的问题是对PixelShader的压力太大,shadertoy中很多代码都在PixelShader中循环几十上百次,显然在真实开发中很难使用这样的代码。&/p&&p&
这里介绍一种使用VertexShader进行光线追踪的思路,以制作实时溶球作为例子。&/p&&p&
直接实现的思路是建立溶球的Distance Field,在PixelShader中从视点开始推进光线,循环直到Distance Field为0,达到溶球表面,然后计算反射折射等。这样的方法,在PixelShader中至少需要十几次循环才能trace到溶球表面。&/p&&img src=&/50/v2-6f04093eccbf096c7be18ec589e762fe_b.png& data-rawwidth=&1365& data-rawheight=&758& class=&origin_image zh-lightbox-thumb& width=&1365& data-original=&/50/v2-6f04093eccbf096c7be18ec589e762fe_r.png&&&p&
改进思路是将光线追踪代码移到VertexShader中,在Mesh的每个顶点进行光线追踪计算,按照光线追踪的结果进行顶点变形。如图中,使用一个球形的Mesh做顶点变形,每个顶点的位置按照光线追踪的结果向内收缩,直到溶球表面。&/p&&br&&img src=&/50/v2-cb8814345_b.png& data-rawwidth=&300& data-rawheight=&270& class=&content_image& width=&300&&&p&
如果选择合适的球形Mesh大小和位置,收缩的步骤可以小到三次以内。这个方法同时减少了光线追踪的循环次数,也减轻了PixelShader的压力。完全可以在移动平台上运行。&/p&&img src=&/50/v2-b4d6c47bfdc_b.png& data-rawwidth=&852& data-rawheight=&403& class=&origin_image zh-lightbox-thumb& width=&852& data-original=&/50/v2-b4d6c47bfdc_r.png&&
实时光线追踪的溶球,左:添加反射,右:添加折射和深度&br&&p&
另一种减少计算量的方法就是Dithering,在独立游戏Inside中的体积光渲染就使用了这种的技术。&/p&&p&
在我的另外一篇&a href=&/p/& class=&internal&&游戏开发相关实时渲染技术之体积光&/a&描述过高质量的体积光渲染应该使用光线追踪的方法。问题在于优质的体积渲染需要的循环次数可能会达到一百次以上,如果循环次数降低到一定程度会因为采样数不足,会造成条纹状瑕疵。&/p&&p&
这里的改进思路是,在光线追踪的起点添加随机噪音,这样条纹状瑕疵会变成更加随机的噪点。之后再添加一层模糊或者是抗锯齿,这样整体的瑕疵感就会明显减少。&/p&&br&&img src=&/50/v2-cd7ce371823_b.png& data-rawwidth=&800& data-rawheight=&376& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/50/v2-cd7ce371823_r.png&&&p&
左:条纹状瑕疵,中:随机噪点,右:抗锯齿模糊&/p&&p&
这种方法的缺点就是渲染的对象会显得比较模糊,不过用于体积光这种本身就不是很清晰的渲染对象倒是很适合。&/p&&h2&&b&体积贴图&/b&&/h2&&p&
光线追踪重要的应用之一就是体积渲染。shadertoy中的体积渲染大多是使用隐式参数方程和实时算法生成噪音来制造体积的Distance Field。这种方法对于不熟悉数学的人来说难度有点大,也不适合美术人员创作。所以体积渲染时最常用的还是用Houdini等软件生成体积贴图。&/p&&p&
目前主流游戏引擎还没有全面支持3DTexture,所以我们要用体积切片的方法模拟3DTexture。Houdini和Blender都有方法渲染体积切片。渲染好的切片按照顺序组成一张平铺贴图。&/p&&p&&img src=&/50/v2-571c39ed4da34f116c4026_b.png& data-rawwidth=&1508& data-rawheight=&840& class=&origin_image zh-lightbox-thumb& width=&1508& data-original=&/50/v2-571c39ed4da34f116c4026_r.png&&
在采样的时候,先确定采样点的所处z轴位置上下两张贴图,在uv位置采样两次,然后通过z轴lerp两个采样数据,就可以得到采样点的密度数据了。&/p&&h2&&b&引擎集成&/b&&/h2&
将光线追踪的体积渲染集成到游戏引擎中会有两个问题。&br&&p&
第一是作为体积渲染的载体Mesh。片面Mesh肯定是不合适的,因为转一个角度可能就看不到了,应该选择闭合的Mesh。这个Mesh应该仿照天空球方法,法线向内,因为如果法线向外,进入Mesh内部就没办法显示了。&/p&&p&
第二是和场景现有物体的遮挡问题。解决方案是获得场景的深度信息,做光线追踪的时候反过来从场景的深度位置向视点进行追踪,这样就能完美实现遮挡了。如果做正向光线追踪就需要在每次循环的时候检查一下深度信息,做无谓的消耗。&br&&img src=&/50/v2-d3aa50a4fbc7d9e64cad0a53d1db3efe_b.png& data-rawwidth=&1104& data-rawheight=&635& class=&origin_image zh-lightbox-thumb& width=&1104& data-original=&/50/v2-d3aa50a4fbc7d9e64cad0a53d1db3efe_r.png&&
图:使用反向法线和场景深度信息制作的体积渲染&/p&&br&&p&补充最近用这种方法做的webgl测试网页&/p&&p&使用chrome浏览器可浏览&/p&&p&简单体积渲染&/p&&a href=&/?target=https%3A//foxhuntd.github.io/crystalBall/crystallBall.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&foxhuntd.github.io/crys&/span&&span class=&invisible&&talBall/crystallBall.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&p&体积流体模拟&/p&&a href=&/?target=https%3A//foxhuntd.github.io/simulation/simulation.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&foxhuntd.github.io/simu&/span&&span class=&invisible&&lation/simulation.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
提到游戏使用的实时渲染,很多人都会觉得光栅化渲染是唯一的方法,而想要在游戏中使用实时的光线追踪,似乎还是遥远的梦想。 虽然整体的光线追踪实时渲染架构以及相关硬件还在试验阶段,但从2016GDC的技术展示来看,游戏开发者在实践中已经找到了不少能利用…
&img src=&/50/v2-58e72d8eeef05e9949dcb_b.png& data-rawwidth=&926& data-rawheight=&531& class=&origin_image zh-lightbox-thumb& width=&926& data-original=&/50/v2-58e72d8eeef05e9949dcb_r.png&&生产效率和运行效率的平衡&br&新流程的导入与旧流程的改善的平衡&br&程序与美术工作量的平衡&br&满地都是坑&p&作为只能看着干着急当不成TA的码农,把大半年来查过内容做下简单的小结。&br&一来作为整理笔记之用,二来如果可以从路过的大佬那里学到点东西就赚到了。&/p&&p&首先,从工作流层面觉得可以大致分为两种,我分别称之为Unique流,Uniform流。&br&这两种流程在出发点上有很大的不同,进而导致在实现技巧上也会产生许多差别。&br&但说到底只是思路上的划分,对技术选型也许有指导作用,但实际开工起来并不需要在意。&br&&/p&&p&---------------------------------------------------------------------------------&br&&/p&&h2&&b&Unique流&/b&&/h2&&p&以提高Asset的质量为主要目标。特点是会有一堆不常见的材质,以及细节处理往往比较到位,有数不清的DCC插件。适合长周期开发的线性流程游戏。&/p&&p&&b&代表&/b&&/p&&ul&&li&Uncharted4 &br&&a href=&/?target=http%3A///other/2016/naughty_dog/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Technical Art of Uncharted 4&i class=&icon-external&&&/i&&/a&&/li&&/ul&&br&&p&&b&技巧&/b&&/p&&ul&&li&各种花式Vertex Paint&/li&&ul&&li&利用PCG来辅助Paint,减少体力劳动&br&基本上Procedural也是个整体趋势,在美术资源量的暴涨的现在,全都靠体力劳动也越来越不现实了。常见的有用Physics Simulation来往路上铺小石块,摊碎玻璃,在Substance Designer里面做各种Procedural的材质。这里类似的,Vertex Paint也可以通过加入简单的模板来简化人工操作。&/li&&li&Paint的结果语意越明确越好&br&比如直接在AO范围里铺上青苔。美术可能不会主动想到Bake完的AO还能挪作他用,但在语意足够直观的情况下,配合美术主导的Material(Shader)制作,一套信息很可能可以重复利用多次。&/li&&/ul&&li&多样的材质/渲染方式&/li&&ul&&li&花式顶点动画&br&&a href=&/?target=https%3A///watch%3Fv%3DLjCjXFmkX-4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Uncharted 4 General-Purpose Vertex Processing - Naughty Dog&i class=&icon-external&&&/i&&/a& (油管)&br&草的模拟,树枝的模拟(草+pivot),头发的模拟,用贴图保存帧动画,小物件等。&br&&br&特别是小物件这个,特别适合给场景增加点动态并且开销几乎可以忽略,是个增加细节的好方法。上面神海举了钟盘的例子,&a href=&/?target=http%3A///play/1022966/Animating-With& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Destiny&i class=&icon-external&&&/i&&/a&里面也有多种武器上的小部件的例子。以及一些非事件性交互,比如玩家经过的时候木板的形变(好像Uncharted做过)。&/li&&li&&a href=&%E2%97%8B%20/questions/482063/no-documentation-page-for-mesh-decals.html& data-editable=&true& data-title=&Mesh decal(UE4)& class=&&&Mesh decal(UE4)&/a& / &a href=&%E2%97%8B%20/share?#/view/scf1b& data-editable=&true& data-title=&Skirts(RAD) & class=&&&Skirts(RAD) &/a&&br&其实就是deferred decal的mesh版。适用于为平坦的模型增加细节,填补模型交界处的seam(蹲墙角),让Hint物件融于场景(攀爬用的边缘之类)。用法意外的很多样。&br&虽然根据&a href=&/?target=http%3A///discussion/135773/uncharted-4/p5%23Comment_2449893& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里的&i class=&icon-external&&&/i&&/a&讨论来看,很多时候为了运行效率还是得一切从简。&br&&img src=&/50/v2-020d1305926ecbcec1aceb02ac01200a_b.png& data-rawwidth=&204& data-rawheight=&136& class=&content_image& width=&204&&&/li&&li&Sky Flow &a href=&/?target=http%3A///play/1020146/Moving-the-Heavens-An-Artistic& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/play/10201&/span&&span class=&invisible&&46/Moving-the-Heavens-An-Artistic&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&用FlowMap来模拟云的流动。但FlowMap甚至都不是贴图,而是指定一个风向在运行时算各个点的Vector出来。原本的目的似乎是降低迭代开销,而且实际效果也不差。&/li&&/ul&&br&&li&海量DCC辅助工具&br&&a href=&/?target=https%3A//youtu.be/aZJQuHZQakQ%3Ft%3D25m1s& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Uncharted 4's Technical Art Culture&i class=&icon-external&&&/i&&/a&(油管)&/li&&/ul&&p&&b&优点&/b&&/p&&p&其实挺难说是优点的。但是美术自由度够高的时候就能靠劳力解决一切问题!(并不是)&br&然后就是当工作环境是以DCC(带插件)为主的时候,运行时的开销就可以压榨的相对较低。(但事实因为材质种类不少,会给引擎简化(优化)带来障碍,所以也挺难说)&/p&&br&&h2&&b&Uniform流&/b&&/h2&&p&&b&代表&/b&&/p&&ul&&li&BattleFront&br&&a href=&/?target=http%3A///2016/03/photogrammetry-and-star-wars-battlefront/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Photogrammetry and Star Wars Battlefront&i class=&icon-external&&&/i&&/a&&br&&/li&&li&Witcher3(也可能是资源有限结果上来说人物比场景精细多了)&br&&a href=&/?target=http%3A///discussion/174377/witcher-3-blood-and-wine-architectural-material& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Witcher 3 Blood and Wine architectural material&i class=&icon-external&&&/i&&/a&&/li&&/ul&&p&以提高Asset制作效率,迭代效率为目标。特点是,有统一生产流程,通常有1,2个(极少量)通用材质,和Photogrammetry协作良好,需要勇敢的美术。适合制作阶段需要快速推进的开放世界游戏。&/p&&br&&p&&b&技巧&/b&&/p&&ul&&li&Detail Map 其实也不是什么新鲜的东西了。但贴图分辨率被屏幕分辨率绑架这个问题目前似乎还没有特别好的解决办法。于是粗粒度的基础贴图加上细粒度的细节贴图还是个相对容易用起来的方法。并且通过PCG(Substance等)的普及,美术大大们对噪声纹理的理解也逐步加深,用少量的资源组合出更多的变化也不再是什么高级技巧了。&/li&&li&Asset Painter(涂地形的时候不仅是贴图,还包括植物,小石块等的自动摆放)&br&这方面因为UE4和Unity的普及程度直线上升。但是动态加载以及纯Procedural的分布还是难点(也就是只在渲染的时候生成分布信息;理想情况可以降低CPU负载)。另外分布算法本身也还没有业界标准的样子。&/li&&li&Texture Array&br&这个最近还在尝试中。主要是限制访问贴图的形式来提高GPU效率。&br&对贴图资源的制作会带来一些限制。比如美术自己做Material的时候可能会束手束脚。&/li&&li&Terrain&/li&&ul&&li&World Aligned UV / Triplanar Mapping&br&虽然也因为UE4和Unity名词被普及了,但实际的应用还是寥寥可数。&br&Witcher3只用在了远景上。&br&并且因为是远景所以只Sample一次区别也不明显。(用的一手好动态分支...)&br&&img src=&/50/v2-e6d1495352_b.png& data-rawwidth=&906& data-rawheight=&272& class=&origin_image zh-lightbox-thumb& width=&906& data-original=&/50/v2-e6d1495352_r.png&&在常规的Triplanar Mapping意外,比如只取垂直方向,配合Mask Texture给全场景加上积雪,腐蚀效果等也是完全可以考虑的。&/li&&li&Tessellation(怀疑态度… 下面BattleFront这效果科学吗!!!)&br&手头上的实验结果性能完全还没有达到可以用的程度... 继续死磕&br&&img src=&/50/v2-4b6adbfa5e5a_b.png& data-rawwidth=&419& data-rawheight=&472& class=&content_image& width=&419&&&/li&&li&Terrain Blend &br&&a href=&/?target=http%3A///discussion/181140/unreal-4-terrain-blending-tool-inspired-by-star-wars-battlefront& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[Unreal 4] Terrain Blending Tool (inspired by Star Wars: Battlefront)&i class=&icon-external&&&/i&&/a&&br&(↑作者自称是懒人所以至今没有上架,比较在意Normal具体是怎么处理的)&br&&a href=&/?target=https%3A//80.lv/articles/free-solution-for-blending-meshes-into-landscape/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Free Solution for Blending Meshes Into Landscape&i class=&icon-external&&&/i&&/a&&br&(↑这个可以直接下载来用,但是反正直接用SDF的话自己写一个也不花时间,但是这篇没有处理Normal Adjust的部分只是粗暴的Blend了一下)&br&&br&开始被BattleFront的视频给震惊了,摸索了半天没想到有人已经在UE4里面复刻出来了&br&说白了就是地表的Color和Normal混入模型跟地面接触的部分。&br&&/li&&/ul&&/ul&&img src=&/50/v2-7f71011fec934cb10b02_b.jpg& data-rawwidth=&2934& data-rawheight=&1234& class=&origin_image zh-lightbox-thumb& width=&2934& data-original=&/50/v2-7f71011fec934cb10b02_r.jpg&&&ul&&ul&&li&Pigment Map &a href=&/?target=http%3A//twvideo01.ubm-us.net/o1/vault/GDC2014/Presentations/Gollent_Marcin_Landscape_Creation_and.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Landscape creation andrendering in REDengine 3&i class=&icon-external&&&/i&&/a&&br&&br&基本上就是为了解决青草种在黄色的土地上的问题。先来张航空摄影,然后画草的时候混点地面颜色就解决了。(听起来好简单)&/li&&/ul&&/ul&&br&&ul&&ul&&li&World Machine(外挂233)还在收集资料中&/li&&/ul&&/ul&&p&&b&优点&/b&&br&&/p&&p&除了制作效率,限制了个体的特殊性也为引擎的优化带来了更多可能性。&br&另外就是,虽然这套东西常见于开放世界,但仔细想想小规模的游戏也完全可以使用这里的技巧来加速生产,或是加入一些独特的视觉效果,毕竟这些技巧丢进去就是对所有物体生效的。&/p&&p&---------------------------------------------------------------------------------&/p&&p&&b&杂记&/b&&/p&&ul&&li&之前在玩大舅的时候注意到,强风下的树叶完全看不出Quad的形状,猜测是不是不止做了顶点动画,树叶本身还动用了帧动画,结果虽然看着眼花但效果挺喜欢的。&br&根据&a href=&/p/& class=&internal&&CGWorld 222期的内容&/a&,树和草确实使用了帧动画,而且树叶的Mesh本来也很细。&/li&&/ul&&br&&p&---------------------------------------------------------------------------------&br&&/p&&p&&b&后记&/b&&/p&&p&目测今年也会在这方面继续学习积累,于是不定期更新。&br&有啥有意思的课题欢迎一起讨论。&br&&br&前两天11区UE4DD更新了几个看起来不错的Slide,看完之后估计会并入正文里去。&br&&a href=&/?target=http%3A//slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&slideshare.net/EpicGame&/span&&span class=&invisible&&sJapan/epic-games-japan-ue4dd&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&/?target=http%3A//slideshare.net/EpicGamesJapan/sqex-ue4dd& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&slideshare.net/EpicGame&/span&&span class=&invisible&&sJapan/sqex-ue4dd&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&/?target=http%3A//slideshare.net/EpicGamesJapan/byking-ue4dd& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&slideshare.net/EpicGame&/span&&span class=&invisible&&sJapan/byking-ue4dd&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/p&&p&题图是&a href=&/?target=https%3A///marketplace/open-world-demo-collection& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UE4 DEMO材质包&i class=&icon-external&&&/i&&/a&,文章内的图均来自相关链接的原文。&/p&
生产效率和运行效率的平衡 新流程的导入与旧流程的改善的平衡 程序与美术工作量的平衡 满地都是坑作为只能看着干着急当不成TA的码农,把大半年来查过内容做下简单的小结。 一来作为整理笔记之用,二来如果可以从路过的大佬那里学到点东西就赚到了。首先,从…
&img src=&/50/552a1ffe66_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/50/552a1ffe66_r.jpg&&&p&体素除了能应用于像《我的世界(Minecraft)》形式的游戏,还可以有更细致的表现,成为下一代的三维游戏世界构成方式,本文从技术角度分析当中的原理及相关技术。&/p&&p&(标题图片来自 &a href=&/?target=https%3A///view/MlfGR4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Voxel Pac-Man Shader by Nrx&i class=&icon-external&&&/i&&/a&)&/p&&h2&引言&/h2&&p&现时,主流三维游戏一般都需要庞大、精致的游戏世界(game world,或称为游戏关卡/game level、游戏舞台/game stage)。所谓的游戏世界,不单指玩家可见的三维渲染环境,也包含游戏性系统(游戏机制、物理碰撞、人工智能等)所需的虚拟环境。&/p&&p&多数三维游戏使用三维三角形网格(3D triangle mesh)建构大部分的游戏世界,包括地形、建筑、植被及其他静态物件。一些以自然户外环境为主的游戏,如大部分RPG、MOBA类型游戏,会使用到高度场(height field)去表示地形;一些室内为主的游戏,如一些FPS、TPS、ACT等,会使用构造实体几何(constructive solid geometry, CSG)技术去建构基本的室内环境(在许多游戏引擎中称为 BSP/binary space partitioning 笔刷)。&/p&&p&游戏世界的制作占总制作成本的一大部分,而随著游戏平台的性能提升,以及游戏内容需求的膨胀,游戏世界的制作成本也因应不断提高。以上的制作方法都各有优缺点。三维网格是合乎当代硬件的游戏世界表示方式,也是较自由的建模方式,而且有成熟的数字创作工具(digital content creation tool)如 3ds Max 和 Maya。但其缺点包括建模成本高、仅为表面表示方式(可能无法判断一个任意点在其外还是其内)、不容易修改(尤其是在展开UV之后)、不容易做连续或离散级数的细致程度(level of detail, LOD)等。高度场和 BSP 的制作成本较网格低,而且较容易修改和实现 LOD,但其适用场合就非常局限。&/p&&p&有没有更好的三维游戏界的制作方式?此问题一直是游戏制作的重要探索方向。&/p&&h2&体素&/h2&&p&自2009年《我的世界(Minecraft)》的空前成功,根据&a href=&/?target=http%3A///articles//minecraft-pc-sales-at-12-million-franchise-at-33-million& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IGN于2013年9月的报道&i class=&icon-external&&&/i&&/a&,Minecraft 在所有平台上已售出共三千三百万份。体素(voxel)进入开发者的眼球,成为另一种建构游戏世界的可行方式,见图1、2。&/p&&img src=&/66f8b2ce9d90dc327b97aeeea632bf58_b.jpg& data-rawwidth=&800& data-rawheight=&533& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/66f8b2ce9d90dc327b97aeeea632bf58_r.jpg&&&p&图1:《我的世界》游戏截屏。&/p&&img src=&/f81d6f2428e_b.jpg& data-rawwidth=&958& data-rawheight=&525& class=&origin_image zh-lightbox-thumb& width=&958& data-original=&/f81d6f2428e_r.jpg&&&p&图2: 《我的世界》游戏玩家合作制作的《冰与火之歌》中的君临城。&/p&&p&简单类比,体素就是像素的三维版本。在二维中,我们可使用颜色的二维数组表示一个影像(image);在三维中也可以用体素的三维数组表示一个栅格化的三维空间,每个体素储存一个比特,表示该空间是实心还是空心的,如图3。这种二元体素(binary voxel)是最简单的体素形式,但体素还可以储存其他属性。例如《我的世界》的体素会储存让空间的材质(泥土、石、水等),而在医学上会把CT扫描得来的X射线不透光性(opacity)储存在体素中,如图4。&/p&&p&相对于高度场地形及BSP,体素可以同时制作一般地表、山洞、建筑物等固体。&/p&&img src=&/edebdb402c67babb73b8adf_b.jpg& data-rawwidth=&279& data-rawheight=&334& class=&content_image& width=&279&&图3:把一些体素叠起来,灰色立方体是其中之一个体素。(维基百科图片)&img src=&/1e78a188a_b.jpg& data-rawwidth=&580& data-rawheight=&580& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/1e78a188a_r.jpg&&&p&图4:以体积宣染方法去可视化CT扫瞄的体素数据。(维基百科图片)&/p&&h2&破坏与建设&/h2&&p&由于体素数据的结构简单而均匀,它相对于网格来说更容易修改。因此,游戏可以让玩家建设游戏世界(这是一种用户生成内容/user-generated content, UGC),也可以让游戏规则动态改变游戏世界,例如可破坏物件(destructible object)、地形变形(terrain morphing)等。不单止修改,无中生有也是可能的──《我的世界》和《魔方世界(Cube World)》(图5)等游戏都包含程序式生成内容(procedurally generated content),后者更可以生成一个大型的RPG地图及游戏性内容。当然,纯粹自动生成的内容不一定合乎游戏设计师的要求,但某程度的程序式生成功能可以大幅降低制作成本。&/p&&img src=&/b80f0d07720eadfa1306ec5_b.jpg& data-rawwidth=&800& data-rawheight=&424& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/b80f0d07720eadfa1306ec5_r.jpg&&&p&图5:《魔方世界》完全以程序随机生成内容,让玩家可以不断探索无限的世界。整个游戏仅由一对夫妻制作。&a href=&/?target=https%3A///watch%3Fv%3DfuTT1TFgfoE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&官方預告片&i class=&icon-external&&&/i&&/a&&/p&&h2&更细致的表现&/h2&&p&前述的游戏例子都是使用二元体素,其棱角非常突出,虽然可视为一种风格(如8位游戏机时代的象素风格),但是否有方法改善呢?其中一个方法,就如二维影像,我们可以提升体素数据的分辨率,例如从每立方米一个体素提升至每厘米一个体素,以增强细致程度。然而,体积数据是以立方级数增长的,所需的存储容量很高。例如一个 &img src=&/equation?tex=256%5E3& alt=&256^3& eeimg=&1&& 大小的体素空间含一千六百多万个体素(16M个);而 &img src=&/equation?tex=& alt=&1024^3& eeimg=&1&& 就会增长至过10亿个体素(1G 个)。即使每个体素只占1字节,也需要大量储存空间。当然,我们可以考虑在一般的应用场合中,大量相连的体素是全部空心或实心的,那么我们可以使用一些数据结构去压缩这些原始体素数据,如八叉树。2010年 NVidia 就曾发表研究[8],展示如何高效地使用 GPU 去光线追踪以稀疏体素八叉树(sparse voxel octree, SVO)表示的场景。在该研究中,每体素还存储了颜色及法綫的压缩数据。一个大教堂模型(Sibenik)压缩后以 440MB 存储 40963 的数据,被渲染时的光綫追踪能力达每秒1亿光綫(图6)。GigaVoxels[3][4]也是相似的技术。&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Atomontage 引擎&i class=&icon-external&&&/i&&/a&也是使用含颜色的体素数据,但以独家的方式进行压缩,宣称可以极高帧率实时渲染大型体素场景(图7)。&/p&&p&然而,每体素储存颜色/法綫的方案,未必符合游戏开发所需。此方案的重点,是场景中每个细节(例如达 1cm 的精度)都可以独立编辑。对于在科学应用上通过扫瞄真实场景(例如地形、建筑、生物等)得到的体素数据,这种精确性是必须的。然而,游戏通常只需要虚拟的场景,玩家并不在乎大教堂中的某幅墙的凹凸是否和现实完全相同。从场景制作的角度看,虽然场景能任意雕刻,十分自由,但这种自由度反而难以管理及掌控。情况有如在二维游戏中,可任意绘画的非常巨大的地图。这个问题的争论点类似在id Software的MegaTexture/虚拟纹理(virtual texturing)技术[1][6]所产生的制作及游戏容量问题。以下将描述利用等值面提取及数据扩大解决细致程度及容量问题。&/p&&img src=&/2a33d3e1f5363cdfbd2d7ad798a35632_b.jpg& data-rawwidth=&800& data-rawheight=&609& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/2a33d3e1f5363cdfbd2d7ad798a35632_r.jpg&&&p&图6: 把 Sibenik 模型体素化为40963的稀疏体素八叉树(SVO),每个体素含颜色及法线,以GPU光线追踪渲染。&/p&&img src=&/f8dbb05ff72f9d525f83d441_b.jpg& data-rawwidth=&1280& data-rawheight=&605& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/f8dbb05ff72f9d525f83d441_r.jpg&&&p&图7: Atomontage 引擎实时渲染大型体素场景,场景可以被动态任意破坏。&/p&&h1&等值面提取&/h1&&p&对于上述谈到的棱角问题,以光綫追踪渲染体素时,可以加入一些插值方式及法綫数据令效果更为平滑。另一个渲染方法,是在体素中储存标量数据,然后提取该标量场的等值面(isosurface),生成三维网格,再以普通的光栅化方式渲染。如果类比二维的情况,就如同提取高度场的等高綫(contour line),再把这些等高綫渲染。在三维的情况,我们可以存储场景的物质密度,或是有符号距离(signed distance),作为标量场。&/p&&p&给定一个标量场,我们可以使用经典的移动立方体(Marching Cubes, MC)算法[10]去提取等值面。MC 算法十分简单,只需扫瞄体素数据,若等值(isovalue)介乎两个相邻体素的值之间,便使用綫性插值求出中间的等值面顶点,最后使用查表去决定如何把这些顶点连接成等值面三角网格。由于 MC 只能生成圆滑的等值面,不能表示锐利的顶点及棱,后来的对偶轮廓(dual contouring, DC)[7]可以解决此问题,但就需要在体素中加入法綫数据,效果如图9所示。&/p&&img src=&/e01cf1a8de0_b.jpg& data-rawwidth=&518& data-rawheight=&269& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&/e01cf1a8de0_r.jpg&&&p&图8: 移动立方体(Marching Cubes, MC)算法中的15个立方体组态。每条棱两端的值与等值比较后,若一个大于等值,一个小于等值,就在该棱上线性插值生成顶点,然后按这些组态生成三角面片。(维基百科图片)&/p&&img src=&/e19bf2a86_b.jpg& data-rawwidth=&800& data-rawheight=&579& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/e19bf2a86_r.jpg&&&p&图9: 对偶轮廓(dual contouring, DC)算法可以同时保持锐利的顶点及棱&/p&&p&CryEngine 3和C4 Engine所支持的体素建构场景功能,都使用了这类等值面提取方式。这两个引擎都是以体素方式解决高度场地形的缺点(如无法表示山洞)。下一代的《无尽的任务》包括两个作品《EverQuest Next》及《EverQuest Next Landmark》整合了&a href=&/?target=http%3A///vfweb/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Voxel Farm Engine&i class=&icon-external&&&/i&&/a&,全面使用了等值面提取方式的体素去建构大型的游戏世界,包括地形、洞穴、建筑物等(圖10),而且还加入破坏/改变游戏环境的技能设计。&/p&&img src=&/ab383fe1f8b022aa6b1c68_b.jpg& data-rawwidth=&800& data-rawheight=&569& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/ab383fe1f8b022aa6b1c68_r.jpg&&&img src=&/dd8fea0b517_b.jpg& data-rawwidth=&800& data-rawheight=&566& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/dd8fea0b517_r.jpg&&&p&图10: 《EverQuest Next》的场景截屏,地形和建筑物都是用体素建模,生成圆滑或尖锐边缘的网格,再使用紋理映射加強细节及营造游戏独特的美术风格。体素编辑演示视频。&/p&&h2&数据扩大&/h2&&p&使用等值面提取方式后,不需要高分辨率的体素来产生圆滑的表面,可以说一方面解决了棱角的问题。但另一方面,我们如何在不大幅增加数据量的情况下,提升细致程度?其中一个通用技术就是数据扩大(data amplification)──用小量数据生成大量数据。一般高度图地形简单地采用多层重复密铺(tiling)的纹理,也可算是一种简单的数据扩大。这种方法也可以应用到等值面提取上,不过它需要更复杂的纹理映射方式,例如 C4 Engine 可混合三个平面投影去混合纹理采样(tri-planar mapping)[9]。要避免视觉上的重复问题,还可以考虑 Wang Tile [10] 或者其他纹理生成技术,这可能涉及如何参数化(parameterize)等值面的问题。可以参看图11《EverQuest Next》的例子。&/p&&img src=&/922899dec6f9e_b.jpg& data-rawwidth=&1280& data-rawheight=&922& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/922899dec6f9e_r.jpg&&&p&图11:《EverQuest Next》混合两个投影纹理,以映射至任何拓扑结构的生成网格。&/p&&p&除了表面的纹理外,还可以加强几何方面的复杂度,例如我们可以使用位移贴图技術(displacement mapping)去为表面加上更多细节。&/p&&h2&数字雕刻与其他建模方式&/h2&&p&之前谈及许多体素的表示方式,以下再談可如何建立、编辑这些数据,用图形学的述语,就是建模(modeling)。体素非常适合数字雕刻(digital scupting),即是把体素当作粘土,提供贴土、推入、拉出、磨平、捏造等工具去制作模型。Mudbox(图12)和 ZBrush 是现成的数字雕刻工具,但这类工具通常是基于对表面网格几何作出修改,而不能改变模型的拓扑结构。采用体素就不会出现这种拓扑问题,但相对地其编辑工具还未成熟。&/p&&img src=&/30e5e5f930d01cba20f2a30d07f1f3bd_b.jpg& data-rawwidth=&800& data-rawheight=&453& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/30e5e5f930d01cba20f2a30d07f1f3bd_r.jpg&&&p&图12:使用 Mudbox 在模型网格上进行数字雕刻。现时这类技术通常用于角色建模及纹理,通过法线/位移贴图去增加细节。&a href=&/?target=http%3A///watch%3Fv%3Dz5X8E8IY9wU& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基本?刻教程&i class=&icon-external&&&/i&&/a&。&/p&&p&体素的一个特点,是可以简单地实现构造实体几何(CSG)。为了更容易建模,可以使用CSG去为建筑等人工物建模,在运行时才体素化。这样比直接雕刻省时,容易修改,而且更能节省容量,并更适合一些自动生成算法。以二维来类比,就像在Photoshop中使用矢量形状编辑,需要时才光删化成像素。另外,对于普通的三维网格,也可以进行体素化,但并不容易保存原来的纹理映射。&/p&&h2&高级渲染技术&/h2&&p&除了等值面提取及纹理贴图等技术外,体素在渲染上还有很多可发展的技术。由于体素适合光线追踪,近年有一些研究使用了体素为基础的实时全局光照,例如体素圆锥追综(voxel cone tracing)[5]。如果游戏世界本身已经是由体素组成,就省却体素化(voxelization)的步骤。而这种全局光照,除了常见的漫反射表面(diffuse surface)的二次反射,还可以实现面积光源、光泽反射/折射(glossy reflection/refraction)材质等效果,如图13。&/p&&img src=&/fde14e9e3ecf3d1f9b930_b.jpg& data-rawwidth=&800& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/fde14e9e3ecf3d1f9b930_r.jpg&&&p&图13:利用体素圆锥追综制造全局光照。光源从上而下,在地面反射至拱门天花,红布也有渗色(color bleeding)至天花。另外留意地面材质含有光泽反射。(此场景本身是以三角形网格渲染。)&a href=&/?target=https%3A///watch%3Fv%3DfAsg_xNzhcQ& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&示范视频&i class=&icon-external&&&/i&&/a&。&/p&&h2&游戏性技术&/h2&&p&当然,游戏并不仅是一个实时渲染器,游戏的重点是游戏性(gameplay)。许多二元体素游戏已经展示出一些与别不同的游戏性元素,在此不作详细分析。但在技术层次上,我们还需要解决一些动态体素世界的问题,主要有物理和人工智能方面。在物理方面,最基本的要考虑等值面与刚体形撞的碰撞检测、支撑分析(切割后悬空的部分可能需要掉落,甚至因结构问题而断裂),此外也可研究相关的流体模拟、燃烧模拟。人工智能方面,最基本是视线查测及路径搜寻。体素也可利于进行地理上的推理分析。&/p&&h2&结语&/h2&&p&传统的游戏世界在游戏性、制作上都有一定限制,基于体素的制作方式可带来各种创新,提高游戏品质并控制制作成本。然而,颠覆传统需要各方面的配合,游戏设计、关卡设计、美术制作、游戏性编程都要注入新的思维,也必须辅以扎实的工具及制作流程。在引擎技术上,需要解决大规模世界的多分辨率建模、依 LOD 作资源串流、实时渲染、物理模拟、人工智能等各个方面的需求。&/p&&p&或许这也是一个机遇,可以开拓另一条游戏技术道路,制作未来具技术壁垒的创新游戏。&/p&&h2&参考文献&/h2&&p&[1] Sean Barrett. &a href=&/?target=http%3A///src/svt/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sparse virtual textures&i class=&icon-external&&&/i&&/a&. GDC 2008 presentation, 2008.&/p&&p&[2] Michael F Cohen, Jonathan Shade, Stefan Hiller, and Oliver Deussen. &a href=&/?target=http%3A//citeseerx.ist.psu.edu/viewdoc/download%3Fdoi%3D10.1.1.8.9049%26rep%3Drep1%26type%3Dpdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wang tiles for image and texture generation&i class=&icon-external&&&/i&&/a&, volume 22. ACM, 2003.&/p&&p&[3] Cyril Crassin, Fabrice Neyret, Sylvain Lefebvre, and Elmar Eisemann. &a href=&/?target=http%3A//hal.inria.fr/docs/00/34/58/99/PDF/CNLE09.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gigavoxels: Ray-guided streaming for efficient and detailed voxel rendering&i class=&icon-external&&&/i&&/a&. In Proceedings of the 2009 symposium on Interactive 3D graphics and games, pages 15–22. ACM, 2009.&/p&&p&[4] Cyril Crassin, Fabrice Neyret, Miguel Sainz, Elmar Eisemann, et al. Efficient rendering of highly detailed volumetric scenes with gigavoxels. GPU Pro, pages 643–676, 2010.&/p&&p&[5] Cyril Crassin, Fabrice Neyret, Miguel Sainz, Simon Green, and Elmar Eisemann.&a href=&/?target=http%3A//hal.archives-ouvertes.fr/docs/00/65/01/73/PDF/GIVoxels-pg2011-authors.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Interactive indirect illumination using voxel cone tracing&i class=&icon-external&&&/i&&/a&. In Computer Graphics Forum, volume 30, pages . Wiley Online Library, 2011.&/p&&p&[6] Charles Hollemeersch, Bart Pieters, Peter Lambert, and Rik Van de Walle.&a href=&/?target=http%3A///vt/AcceleratingVirtualTexturingUsingCUDA-b10648-49.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Accelerating virtual texturing using cuda&i class=&icon-external&&&/i&&/a&. Gpu Pro: Advanced Rendering Techniques, pages 623–641, 2010.&/p&&p&[7] Tao Ju, Frank Losasso, Scott Schaefer, and Joe Warren. &a href=&/?target=http%3A//faculty.cs.tamu.edu/schaefer/research/dualcontour.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dual contouring of hermite data&i class=&icon-external&&&/i&&/a&. In ACM Transactions on Graphics (TOG), volume 21, pages 339–346. ACM, 2002.&/p&&p&[8] Samuli Laine and Tero Karras. &a href=&/?target=http%3A///docs/IO/88889/laine2010i3d_paper.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Efficient sparse voxel octrees&i class=&icon-external&&&/i&&/a&. Visualization and Computer Graphics, IEEE Transactions on, 17(8):, 2011.&/p&&p&[9] Eric Stephen Lengyel. &a href=&/?target=http%3A///lengyel/Lengyel-VoxelTerrain.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Voxel-Based Terrain for Real-Time Virtual Simulations&i class=&icon-external&&&/i&&/a&. PhD thesis, UNIVERSITY OF CALIFORNIA, 2010.&/p&&p&[10] William E Lorensen and Harvey E Cline. &a href=&/?target=http%3A//fab.cba.mit.edu/classes/S62.12/docs/Lorensen_marching_cubes.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Marching cubes: A high resolution 3d surface construction algorithm&i class=&icon-external&&&/i&&/a&. In ACM Siggraph Computer Graphics, volume 21, pages 163–169. ACM, 1987.&/p&&p&本文原于日在腾讯内部揭载,获授权公开。&/p&&p&&a href=&/?target=http%3A///2013/voxel-game-world/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&以体素建构三维游戏世界&i class=&icon-external&&&/i&&/a&&/p&
体素除了能应用于像《我的世界(Minecraft)》形式的游戏,还可以有更细致的表现,成为下一代的三维游戏世界构成方式,本文从技术角度分析当中的原理及相关技术。(标题图片来自 )引言现时,主流三维游戏一般都需要庞大、精致…
本人二十多年前开始对图形学有兴趣,并进行自学。那时候能找到的学习材料比较杂乱,有来自BBS的文档及代码,有一些不太系统的书籍。后来开始阅读著名的教材《&a href=&///?target=http%3A///subject/2696023/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Computer Graphics (豆瓣)&i class=&icon-external&&&/i&&/a&: Principle and Practice 2nd Edition》(CGPP),发觉非常难读,当然一方面是自己的能力有限(那时候高一),另一方面是觉得有些比较简单的部分花了很多篇幅,有些重点的学习曲线非常陡峭。&br&&img src=&/ef2be6da7ddbdc0fcd302c_b.jpg& data-rawwidth=&1600& data-rawheight=&1200& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/ef2be6da7ddbdc0fcd302c_r.jpg&&&br&第二版的资料比较过时,但过了二十多年作者们才出了第三版,我买了一本(右图),但只读了一小部分,所以不在此妄下评论。&br&&br&对于学习计算机图形,我觉得需要考虑是以哪种心态去学习。如果只是想了解一下,体验一下,可以选择一些较简单的方式,例如Processing相关的。《&a href=&///?target=http%3A///subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Nature of Code (豆瓣)&i class=&icon-external&&&/i&&/a&》是一本写给任何程序员甚至是非程序员,有关图形、动画的书,使用Processing作为例子。网上版是免费的&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Nature of Code&i class=&icon-external&&&/i&&/a&,国内也快有翻译版《&a href=&///?target=http%3A///subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&代码本色:用编程模拟自然系统 (豆瓣)&i class=&icon-external&&&/i&&/a&》,本人第一次获邀写本书的&a href=&///?target=http%3A//.cn/tupubarticle/3725& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&推荐序&i class=&icon-external&&&/i&&/a&(求轻拍……)。&br&&br&&img src=&/d7ac75ee4fd1b8c_b.jpg& data-rawwidth=&363& data-rawheight=&363& class=&content_image& width=&363&&&br&如果希望更正统地去学习,可以选择公开课及大学教科书。我并没有这方面的学习经验,但似乎《&a href=&///?target=http%3A///subject/3829906/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fundamentals of Computer Graphics, Third Edition (豆瓣)&i class=&icon-external&&&/i&&/a&》是一个不错的选择,作者是Utah及Cornell的教授,而且本书曾用于多所大学的课程(见&a href=&///?target=http%3A//www.cs.cornell.edu/%7Esrm/fcg3/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fundamentals of Computer Graphics, Third Edition&i class=&icon-external&&&/i&&/a&)。&br&&br&&img src=&/cc0fa650abde995a85b89a6_b.jpg& data-rawwidth=&300& data-rawheight=&388& class=&content_image& width=&300&&&br&另一本常作为教材,但只集中讨论离线渲染的是《&a href=&///?target=http%3A///subject/4306242/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Physically Based Rendering, Second Edition (豆瓣)&i class=&icon-external&&&/i&&/a&》(PBRT)。它的一个优越之处是配合开源项目&a href=&///?target=https%3A///mmp/pbrt-v2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mmp/pbrt-v2 · GitHub&i class=&icon-external&&&/i&&/a&,而且书里采用了&a href=&///?target=http%3A//zh.wikipedia.org/wiki/%25E6%E5%25AD%25A6%25E7%25BC%%25A8%258B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&文学编程&i class=&icon-external&&&/i&&/a&(&a href=&///?target=http%3A//en.wikipedia.org/wiki/Literate_programming& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Literate programming&i class=&icon-external&&&/i&&/a&)方式去展示源代码,这样会更容易理解代码和理论之间的关联。&br&&br&&img src=&/d2f4d3f054e1a5d0ca663_b.jpg& data-rawwidth=&318& data-rawheight=&417& class=&content_image& width=&318&&&br&提到PBRT,不能不提《&a href=&///?target=http%3A///subject/3213439/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Real-Time Rendering, Third Edition (豆瓣)&i class=&icon-external&&&/i&&/a&》(RTR)。相对于制作CG(动画电影、电影特效)的离线渲染,实时渲染是游戏的核心部分,这本书被誉为游戏引擎开发者的天书。这本书的内容非常多,涉及实时渲染的方方面面,写作手法亦非常简明易读。但由于许多细节内容实在放不进这本超过1000页的著作,但作者们非常仔细地包含了大量的参考文献,可以作为这个领域的指南。但第3版已经是2008年出版,期待第4版。&br&&br&&img src=&/1dacd67_b.jpg& data-rawwidth=&294& data-rawheight=&450& class=&content_image& width=&294&&&br&对于想做实时渲染的朋友,必须要学习相关的API。现时基本上是Direct3D 9/11、OpenGL 3.x/4.x、OpenGL ES 2/3、WebGL,还有一些新的API如iOS的Metal、AMD的Mantle。&br&&br&Direct3D 比较多人阅读的是龙书《&a href=&///?target=http%3A///subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Introduction to 3D Game Programming with DirectX 11 (豆瓣)&i class=&icon-external&&&/i&&/a&》,但DirectX11版已没有龙做封面了。&img src=&/8660eead328c90a17a3adcf2fe21172b_b.jpg& data-rawwidth=&321& data-rawheight=&414& class=&content_image& width=&321&&&br&&br&不过如果对Direct3D9或OpenGL API已有经验,可以阅读《&a href=&///?target=http%3A///subject/6779180/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Practical Rendering and Computation with Direct3D 11 (豆瓣)&i class=&icon-external&&&/i&&/a&》。这本书基本可以代替MSDN的相关介绍,并有几章比较实际应用上的问题处理。&br&&br&&img src=&/e94cec352a3bfc2ae0ea301093baff40_b.jpg& data-rawwidth=&363& data-rawheight=&363& class=&content_image& width=&363&&&br&而OpenGL的经典则是红书《&a href=&///?target=http%3A///subject/6857789/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenGL Programming Guide (豆瓣)&i class=&icon-external&&&/i&&/a&》,现时已经是第8版。我已忘记最初是看哪一版,不过当时的确觉得非常易读。&br&&br&&img src=&/47e4ff74cdb61858bae88e_b.jpg& data-rawwidth=&318& data-rawheight=&417& class=&content_image& width=&318&&&br&OpenGL还有一本比较流行的书籍《&a href=&///?target=http%3A///subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenGL Superbible (豆瓣)&i class=&icon-external&&&/i&&/a&》。&br&&br&&img src=&/c65c7f891ef9616beeca110dbdbe57f8_b.jpg& data-rawwidth=&327& data-rawheight=&408& class=&content_image& width=&327&&&br&计算机图形学可能是在计算机出版中,首先以Gems形式把一些投稿结集出版的学科。1990年开创《&a href=&///?target=http%3A///subject/3282904/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Graphics Gems (豆瓣)&i class=&icon-external&&&/i&&/a&》系列,2002年开始了《&a href=&///?target=http%3A///subject/2049395/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Direct3D ShaderX (豆瓣)&i class=&icon-external&&&/i&&/a&》系列,2004年的《&a href=&///?target=http%3A///subject/1468524/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GPU Gems (豆瓣)&i class=&icon-external&&&/i&&/a&》系列1,2010年的《&a href=&///?target=http%3A///subject/4240701/& class=& wrap external& target=&_blank&

我要回帖

更多关于 unity导入地形 的文章

 

随机推荐