解决后有红包!Unity3D 2017支付宝扫码领红包 ssao错误

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 1557|回复: 1
Unity3D图像后处理特效——Screen Space Ambient Occlusion (SSAO) image effect
74341/5000排名<font color="#FF昨日变化1主题帖子积分
日久生情, 积分 4341, 距离下一级还需 659 积分
日久生情, 积分 4341, 距离下一级还需 659 积分
蛮牛币71436
在线时间352 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
  屏幕空间环境遮挡技术(SSAO)作为一种图像的后处理特效来实时模拟场景的环境遮挡效果。
  As with the other image effects, this effect is only available in Unity Pro and you must have the Pro Standard Assets installed before it becomes available.
  和其他图像特效一样,该特效只能在Unity Pro上进行使用,并且在使用之前必须安装Pro Standard Assets。
_3171.jpg (109.03 KB, 下载次数: 0)
11:00 上传
  SSAO applied to the scene.
  应用于场景中的SSAO效果。
_3091.jpg (102.77 KB, 下载次数: 0)
11:00 上传
  The same scene without SSAO for comparison. Note the differences at the corners where structures or grass meet the ground.
  同样的场景,但没有进行SSAO操作。注意两幅图在建筑物的角落里或草和地面的交接处的差异。
  Properties& & 属性
  Radius
  The maximum &radius& of a gap that will introduce ambient occlusion.
  环境遮挡所需的最大半径值
  Sample Count
  采样点数量
  Number of ambient occlusion samples. A higher count will give better quality but with a higher processing overhead.
  环境遮挡效果所需采样点的个数。较高的采样点数量可以达到更高的质量,但也会造成更高的处理开销
  Occlusion Intensity
  遮挡强度
  The degree of darkness added by ambient occlusion.
  环境遮挡所加的黑暗程度
  模糊度
  Amount of blur to apply to the darkening. No blur (0) is much faster but the darkened areas will be noisy.
  应用到黑暗区域的模糊程度。不使用模糊(0)时,处理效果很快,但黑暗区域会有需要噪点。
  Downsampling
  下采样
  The resolution at which calculations should be performed (for example, a downsampling value of 2 will work at half the screen resolution). Downsampling increases rendering speed at the cost of quality.
  决定在何种计算下所采用的分辨率(比如,四分之一的下采样将应用在一半屏幕分辨率的情况下)。下采样可以增加渲染速度。
  Occlusion Attenuation
  遮挡衰减
  How fast occlusion should attenuate with distance.
  遮挡效果随距离变化的衰减程度
  Z最小值
  Try increasing this value if there are artifacts.
  如果出现误差,可尝试增加该值
  Details& && && &细节原理
  SSAO approximates ambient occlusion using an image processing effect. Its cost depends purely on screen resolution and SSAO parameters and does not depend on scene complexity as true AO would. However, the approximation tends to introduce artifacts. For example, objects that are outside of the screen do not contribute to occlusion and the amount of occlusion is dependent on viewing angle and camera position.
  SSAO技术使用图像处理特效来模拟环境遮挡的效果。它的计算开销完全取决于屏幕分辨率和SSAO的系数,而与场景复杂度和真实的环境遮挡无关。但是,这种模拟也会引入一些瑕疵。比如,屏幕之外的物体将对遮挡效果没有影响,并且遮挡程度取决于视角和的位置。
  Note that SSAO is quite expensive in terms of processing time and generally should only be used on high-end graphics cards. Using SSAO will cause Unity to render the depth+normals texture of the camera which increases the number of draw calls and has a CPU processing overhead. However, the depth+normals texture then can be used for other effects as well (eg, Depth of Field). Once the texture is generated, the remainder of the SSAO effect is performed on the graphics card.
  注意SSAO技术在处理时间上来说是非常耗时的,一般应该用于高端显卡上。使用SSAO技术会让Unity渲染照相机上的深度+法线纹理,这样会增加一定数量的绘制调用和一定的CPU开销。但是,深度+法线纹理同样也可以用于其他特效(比如,景深特效)。一旦纹理生成了,接下来的特效处理就在显卡上进行了。
  Hardware support& &&&硬件支持
  SSAO works on graphics cards with Shader Model 3.0 support (eg, GeForce 6 and later, Radeon X1300 and later). All image effects automatically disable themselves when they can not run on a particular graphics card. Due to the complexity of the effect, SSAO is not supported on mobile devices.
  SSAO特效需要显卡支持Shader Model 3.0(即GeForce 6、Radeon X1300以后的显卡)。所有图像特效如果无法在用户显卡上运行时将会自动被关闭。由于该特效的复杂性,SSAO目前不支持移动设备。
unity ao贴图怎么贴;ao贴图unity ao贴图
每日推荐:
3158/300排名<font color="#FF昨日变化3主题帖子积分
偶尔光临, 积分 158, 距离下一级还需 142 积分
偶尔光临, 积分 158, 距离下一级还需 142 积分
在线时间77 小时
能下载吗??谢谢楼主了。
[]: kuku0603 乐于助人,奖励 1
每日推荐:Unity3D图像后处理特效&&Screen Space Ambient Occlusion (SSAO) image effect -GAD腾讯游戏开发者平台Unity 组件手册
屏幕空间环境光遮蔽 (SSAO) (Screen Space Ambient Occlusion (SSAO))
屏幕空间环境光遮蔽 (SSAO) (Screen Space Ambient Occlusion (SSAO))图像效果实时逼近(作为图像后期处理效果)。它使相互接近的起皱、孔和表面变暗。在实际中,这类区域容易封闭或遮蔽 (occlude) 环境光,因而会表现得更暗。
对于实时环境光遮蔽的最新实现方法,请查看较新的屏幕空间环境光遮蔽 (Screenspace Ambient Obscurance) 效果。
与其他一样,此效果仅适用于 Unity 专业版,并且必须先安装
才能使用。
应用于场景的 SSAO。
未使用 SSAO 的相同场景(用于比较)。请注意结构或草地符合地面条件的角落处的差异。
属性:功能:
半径 (Radius)将引入环境光遮蔽的间隙的最大“半径”。
采样计数 (Sample Count)环境光遮蔽采样次数。较高计数可提供 较好质量,但是处理开销较高。
遮蔽强度 (Occlusion Intensity)环境光遮蔽添加的黑暗程度。
模糊 (Blur)应用于变暗的模糊量。无模糊 (0) 速度快得多,但是变暗的区域具有噪波。
缩小采样 (Downsampling)执行计算时应采用的分辨率(例如,缩小采样值 2 将以屏幕分辨率的一半工作)。缩小采样可提高渲染速度,不过会牺牲质量。
遮蔽衰减 (Occlusion Attenuation)遮蔽随距离衰减的速度。
最小 Z (Min Z)如果存在假象,请尝试增大此值。
SSAO 使用图像处理效果逼近环境光遮蔽。其成本完全取决于屏幕分辨率和 SSAO 参数,而不是如同真实 AO 一样取决于场景复杂性。但是,逼近容易引入假象。例如,处于屏幕外部的对象不会参与遮蔽,遮蔽量取决于视角和相机位置。
请注意,SSAO 在处理时间方面的成本非常高,一般只应在高端显卡上使用。使用 SSAO 会使 Unity 渲染相机的深度+法线纹理,这会增加绘制调用数并产生 CPU 处理开销。但是,深度+法线纹理随后还可以用于其他效果(例如,视野深度 (Depth of Field))。生成纹理之后,便会在显卡上执行 SSAO 效果的其余部分。
该效果需要带像素着色器 (3.0) 或 OpenGL ES 2.0 的显卡。 此外,还需要深度纹理支持。 PC: 自 2004 年后的 NVIDIA 卡 (GeForce 6)、自 2005 年后的 AMD 卡 (Radeon X1300)、自 2006 年后的 Intel 卡 (GMA X3000);移动: 带深度纹理支持的 OpenGL ES 2.0;控制台: Xbox 360、PS3。
将自动禁用所有不被终端用户显卡支持的图像效果。
Page last updated:请完成以下验证码
后使用快捷导航没有帐号?
请完成以下验证码
查看: 2959回复: 24
[unity插件]SSAO Pro1.6.1 高品质后处理(百度网盘)
元素币活跃度贡献值
unity3D区版主
土豪金2178
在线时间4760 小时
楼主-元素创造者
引擎插件类型
引擎插件类型:
马上注册成为元素者,获取海量元素资源,结识各路大神级人物
才可以下载或查看,没有帐号?
本帖最后由 orange_ 于
14:30 编辑
价格:150元素币 销售总额:4950元素币 购买人数:33尊敬的游客 ,本内容需要支付 150元素币 来下载,您可以 或者 。也可使用获取 同等点击次数 ,来轻松下载。资源包名: SSAO Pro1.6.1着色器/全屏幕及相机效果发布者:Thomas Hourdel价格:$25适用版本:要求Unity 4.5.0或更高版本。文件大小:4.73MB资源有问题.或者链接不存在.请私信.或者Q群小窗.看到立马解决
↓↓↓↓↓↓插件仅用于学习,禁止商用,为了维护您的个人权益,请支持正版↓↓↓↓↓↓Asset store 链接:22369
http://pan.baidu.com/s/1sl0IR9b
本帖被以下淘专辑推荐:
& |主题: 19, 订阅: 0
还没有设置签名!您可以在此展示你的链接,或者个人主页!
享有帖子相关版权3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和的同意4、所有内容仅供个人学习、研究之用,请勿用于商业用途5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意7、管理员和版主有权不事先通知发贴者而删除本文', this.href);">论坛版权
元素币活跃度贡献值
活跃度兑换使者
在线时间4438 小时
沙发-元素射日者
{:1_141:}大神好厉害
元素币活跃度贡献值
在线时间6356 小时
板凳-元素追月者
想要成大触,天天上元素!
想要成大触,天天上元素!
元素币活跃度贡献值
元素皇, 积分 47970, 距离下一级还需 52030 积分
元素皇, 积分 47970, 距离下一级还需 52030 积分
在线时间667 小时
地板-元素观星者
想要成大触,天天上元素!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 693, 距离下一级还需 1307 积分
元素侠, 积分 693, 距离下一级还需 1307 积分
在线时间10 小时
想要成大触,天天上元素!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素者, 积分 389, 距离下一级还需 11 积分
元素者, 积分 389, 距离下一级还需 11 积分
在线时间19 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 713, 距离下一级还需 1287 积分
元素侠, 积分 713, 距离下一级还需 1287 积分
在线时间5 小时
大神好厉害大神好厉害
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 29631, 距离下一级还需 369 积分
元素王, 积分 29631, 距离下一级还需 369 积分
在线时间685 小时
从业不识微元素,做遍项目也枉然
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 10053, 距离下一级还需 19947 积分
元素王, 积分 10053, 距离下一级还需 19947 积分
在线时间191 小时
天天逛元素,吃喝玩乐啥都有。{:1_146:}{:1_145:}
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 69873, 距离下一级还需 30127 积分
元素皇, 积分 69873, 距离下一级还需 30127 积分
土豪金1756
在线时间1311 小时
不错~~~~~~~~~~~~~~~
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 1328, 距离下一级还需 672 积分
元素侠, 积分 1328, 距离下一级还需 672 积分
在线时间24 小时
要免费的呀
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素皇, 积分 41427, 距离下一级还需 58573 积分
元素皇, 积分 41427, 距离下一级还需 58573 积分
土豪金1183
在线时间450 小时
这个应该是作为U3D中的摄像机特效组件来用的吧,效果不错,赞!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 11646, 距离下一级还需 18354 积分
元素王, 积分 11646, 距离下一级还需 18354 积分
在线时间200 小时
元素帖子强,满满正能量!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 8632, 距离下一级还需 21368 积分
元素王, 积分 8632, 距离下一级还需 21368 积分
在线时间126 小时
带你赚币带你飞,元素里面有正妹!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 8703, 距离下一级还需 21297 积分
元素王, 积分 8703, 距离下一级还需 21297 积分
在线时间62 小时
资源甚好,发帖艰辛,且阅且珍惜!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4095, 距离下一级还需 905 积分
元素魔, 积分 4095, 距离下一级还需 905 积分
在线时间89 小时
非常棒的东西,一直在找
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4686, 距离下一级还需 314 积分
元素魔, 积分 4686, 距离下一级还需 314 积分
在线时间97 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4686, 距离下一级还需 314 积分
元素魔, 积分 4686, 距离下一级还需 314 积分
在线时间97 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4686, 距离下一级还需 314 积分
元素魔, 积分 4686, 距离下一级还需 314 积分
在线时间97 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4686, 距离下一级还需 314 积分
元素魔, 积分 4686, 距离下一级还需 314 积分
在线时间97 小时
大神好厉害
还没有设置签名!您可以在此展示你的链接,或者个人主页!
【拥有1000元素币】你就可以领取
【拥有3000元素币】其实也是很容易的事情
【1W元素币】的持有者,对于很多元素者来说,是一件值得骄傲的事情!
【5W元素币】的持有者是真的土豪!赶快用它做点什么吧!
达成成就【元素贤者】在元素知道
超过20次解决提问者的问题
达成成就【我是界王】在任意元素QQ群联盟,到达【界王】以上
限量版珍贵徽章,参与元素特定活动,元素T恤获取者
元素【鼓励师】职业标志,从此走上了不一样的巅峰之路。元素鼓励师,一句你就湿!
【元素晶石】
只有【元素大神】才能拥有,自由出入元素秘境之钥
【真爱之花】
情人节限量版,据说此花会带来桃花运!
平时一次性兑换土豪金超过3000,圣诞节期间一次性兑换土豪金超过500即可获取!
圣剑-【塞姆里亚】
【剑LV14,主题=5000】-异次元世界中,上古遗留的神秘物质所铸,只有神才有资格观赏,只有最强的神才有机会获取,圣剑之光有扭转乾坤,创造一切的【创世之力】
【拥有10W元素币】才可以获得,您已经富可敌国了,钱对你来说只是一个数字,没有任何别的意义!
圣杖-【安东尼达斯】
【MP20000】异次元世界的物品,有灵性的法杖,他一直默默的等待你的到来,并且会永远的守护你
【贡献1500】散发出某种奇特的光芒,使佩戴的人充满正能量
【贡献3000】女皇也有被男人欺骗的时候,女皇留下一滴眼泪,然后打造成光鲜亮丽的护身符送给了她的新男宠
【2000小时】的在线,感动12个星座所守护的12件黄金圣衣,用它来保卫你的女神(或者男神)吧!
大天使权杖
达成成就【百万扩散王】自己的博客,QQ空间等外网,发表5篇图文并茂的介绍微元素的原创文章
暂时未开放
达成成就【神的速度】最先成为元素神的30个人,或者土豪重金打造
达成成就【元素之神】升级成为元素神
达成成就【土豪是朋友】单次充值2000RMB或以上
24K金矿镐,往元素矿场投资10W元素币
升级到【星球·资源帝】
天降异火,大菠萝曾经火过,直接获取任何一个售价低于6000元素币的资源
【群组碎片】
创建元素QQ群,群主专属徽章,群人数200+
研发中...神秘粘稠液体
【不死鸟羽翼】
天地浩劫,涅槃重生。掌控六界一切资源
【精华100】能够穿破任何物质的神器,包括空间,时间和圣盾,不然岂不是矛盾
达成成就【神级追猎者】在元素悬赏中200次被评为最佳答案
达成成就【元素智者】在元素知道
超过5次解决提问者的问题
达成成就【元素先知】在元素知道
超过200次解决提问者的问题
达成成就【赏金统帅】发布过100次元素悬赏,并被人解决
达成成就【皇室后裔】最先成为元素皇的30个人,或者土豪逆袭获取
什么都别说了,到底上不上车?
守望者【EX】
守望者EX的强大武器
守望者【死神】
死神护法在暗中守护者他的主人,首发大于3
【MP50】这次的冒险才刚刚开始,和所有故事一样,你得先有一个属于自己的法杖!即使他的法力会在30天后消失
【50小时】的学习,已经证明了你自己,这件法袍是你的了,由于使用了简陋的材料,能穿一个月已经不错了!
元素推荐-友情提示 /1
每周一次的扩散大招带来更多元素币收益!
快速登录:1.合理划分代码模块,以利于长期维护。根据策划需求、程序人员分工合理划分项目模块,不要把所有代码都堆砌在一起,比如:战斗模块、热更新及sdk模块、资源加载模块、UI与逻辑模块(这个是代码量比较大的,还得按具体模块再细分)、网络与协议模块、策划表格的序列化模块、引用第三份库封装模块、lua模块等等,我说的这只是个参考,你自己模块要根据实际项目情况划分,既要考虑到策划将来会加需求,还得尽量让程序之间工作依赖尽量少。&br&&br&2.制定严格的代码、美术资源、策划表格标准和审查方法。比如哪些代码要写在lua中,linq、foreach 是否可以用、哪些函数不可以写在update中、字符串连接怎么做;模型贴图格式是什么、分辨率多少、导入方式是什么、动画采样帧多少、粒子个数限制多少、碰撞采样什么方式;表格内key相互引用要用工具检测、运行时采用什么方式加载、要不要序列化、语言表是否支持符号替换等。这方面细节很多,既要自己总结,还得去看看网络上其他人的总结经验。&br&&br&3.开发功能与代码重构同步,添加美术资源与资源优化并行。针对初级开发人员、容易提交糟糕代码的人员进行必须的培训,不要害怕伤害他自尊,大家相互监督才能共同进步。针对美术资源、shader等最好设置一个有经验的人来专门负责,也就是要有TA岗位,如果人员不足,也尽量抽调人来兼职做。&br&&br&4.很多问题归根结底还是经验不足,没有制定合适的开发流程。所以除了开发游戏功能之外,可以在业余时间,针对团队、个人在相关技术上的不足,辅修相关知识,比如软件工程、图形学等,参与一些同业的分享会议,找一些有经验的大神来分享经验,使用比较好插件、sdk、框架,比如腾讯WeTest、UWA、MVVM框架等,没必要全部从新造车。&br&&br&祝成功!
1.合理划分代码模块,以利于长期维护。根据策划需求、程序人员分工合理划分项目模块,不要把所有代码都堆砌在一起,比如:战斗模块、热更新及sdk模块、资源加载模块、UI与逻辑模块(这个是代码量比较大的,还得按具体模块再细分)、网络与协议模块、策划表…
&figure&&img src=&https://pic7.zhimg.com/v2-a47d48f84a867a81d1c9e_b.jpg& data-rawwidth=&960& data-rawheight=&512& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic7.zhimg.com/v2-a47d48f84a867a81d1c9e_r.jpg&&&/figure&&h2&0x00 前言&/h2&
&p&&figure&&img src=&http://pic3.zhimg.com/v2-4fa48ec638bac01e43e6_b.png& data-rawheight=&507& data-rawwidth=&958& class=&origin_image zh-lightbox-thumb& width=&958& data-original=&http://pic3.zhimg.com/v2-4fa48ec638bac01e43e6_r.png&&&/figure&本文的内容主要来自YouTube播主&strong&Brackeys&/strong&的视频TOP 10 UNITY TIPS 和TOP 10 UNITY TIPS #2。在此基础上经过自己的实践和筛选之后,选择了几个自己觉得还算有趣而平时又有所忽略的小技巧记录在此和各位分享。&/p&
&br&&br&&h2&0x01 编辑器染色 &figure&&img src=&http://pic4.zhimg.com/v2-a2b2ecc34123fa65caa8d06166deaa5b_b.png& data-rawheight=&501& data-rawwidth=&959& class=&origin_image zh-lightbox-thumb& width=&959& data-original=&http://pic4.zhimg.com/v2-a2b2ecc34123fa65caa8d06166deaa5b_r.png&&&/figure&&/h2&&p&这也是这两段视频的第一个小技巧,我自己也觉得很有趣。一个常见的工作情景是我们在调整场景内的某些组件参数时,没有注意到自己是在Play Mode的模式下进行的,从而导致修改没有被保存下来。&br&
这个问题的关键在于是我们没有意识到自己已经处在Play Mode,如果我们能够在修改参数的时候,清楚的意识到自己处于Play
Mode,那么我们自然可以通过Copy Component来保存数据或者是选择在Editor
Mode进行修改。因此,我们可以通过对编辑器染色来醒目的提醒自己,自己是否已经处于Play Mode了。&br&
一个简单的方法就是在Play Mode给编辑器染上不同的颜色:&/p&
&blockquote&&p&Edit-&Preference-&Color-&Playmode tint&/p&
&/blockquote&
&p&在这里,我们就可以修改Play Mode的编辑器颜色了,当然还有很多别的染色可以修改。&br&&figure&&img src=&http://pic1.zhimg.com/v2-33cbe574d3be34_b.png& data-rawheight=&514& data-rawwidth=&800& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&http://pic1.zhimg.com/v2-33cbe574d3be34_r.png&&&/figure&修改完之后,在Play Mode的编辑器大概效果是下面这样的:&br&&/p&
&p&&figure&&img src=&http://pic2.zhimg.com/v2-8b3496fec427e1cdf8b45b1_b.png& data-rawheight=&453& data-rawwidth=&800& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&http://pic2.zhimg.com/v2-8b3496fec427e1cdf8b45b1_r.png&&&/figure&这样,我们就能时刻意识到自己是否已经在Play Mode了。&/p&
&br&&br&&h2&0x02 锁定对象的Inspector视窗&/h2&&p&&figure&&img src=&http://pic2.zhimg.com/v2-a4cf281ad4e67c656b75_b.png& data-rawheight=&509& data-rawwidth=&960& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&http://pic2.zhimg.com/v2-a4cf281ad4e67c656b75_r.png&&&/figure&这是第一段视频的第三个小技巧,我觉得有趣的同时也很实用。还是一个实际的工作情景,场景中有很多对象,我们想创建一个管理器来容纳这些对象,最简单的方法就是在Hierarchy视窗中选择那些对象,将它们拖入管理器的容器中。&/p&
&p&&figure&&img src=&http://pic2.zhimg.com/v2-f9e507bc8d1aed0f64759_b.png& data-rawheight=&537& data-rawwidth=&1240& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic2.zhimg.com/v2-f9e507bc8d1aed0f64759_r.png&&&/figure&但是,我们立马就会发现一个问题,那就是我先选中管理器之后,再去多选所有需要被拖入管理器的对象时,Inspector视窗会变为此时所选中的被管理对象,而非管理器。&/p&&p&这时,我们就用到了这条小技巧,我们可以锁定管理器的Inspector视窗,选中多个被管理对象之后将它们拖入管理器的数组中。我们要做的只是勾选这个小锁子图标,之后就可以同时将多个对象通过锁定的Inspector视窗拖入管理器的数组中了:&/p&&figure&&img src=&http://pic3.zhimg.com/v2-329c0eda6cbd17bc6645986_b.png& data-rawheight=&651& data-rawwidth=&454& class=&origin_image zh-lightbox-thumb& width=&454& data-original=&http://pic3.zhimg.com/v2-329c0eda6cbd17bc6645986_r.png&&&/figure&&br&&br&&h2&0x03 Inspector视窗的Debug Mode模式&/h2&
&p&&figure&&img src=&http://pic1.zhimg.com/v2-a5cc0c56ede2bb5b89d014c_b.png& data-rawheight=&509& data-rawwidth=&961& class=&origin_image zh-lightbox-thumb& width=&961& data-original=&http://pic1.zhimg.com/v2-a5cc0c56ede2bb5b89d014c_r.png&&&/figure&这是第一段视频的第四个小技巧,同样是一个和Inspector视窗相关的技巧。我相信有一些朋友已经经常会用到了,但是我觉得这条也很实用,因此也在此和各位朋友分享。&/p&&p&这个常见的工作场景是这样的:我有一些字段不想通过外部修改,因此声明为private,但是又有在运行时观察这些字段实时值的需求。&figure&&img src=&http://pic3.zhimg.com/v2-f824bc2bdb7ad85e4baa_b.png& data-rawheight=&175& data-rawwidth=&439& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&http://pic3.zhimg.com/v2-f824bc2bdb7ad85e4baa_r.png&&&/figure&&/p&
&p&这时我们就可以点击Inspector视窗右上角的下拉菜单,可以看到它和一般视窗的下拉菜单相比多了几个选项。&/p&
&p&&figure&&img src=&http://pic4.zhimg.com/v2-a56dac8bb49d_b.png& data-rawheight=&296& data-rawwidth=&359& class=&content_image& width=&359&&&/figure&默认状况下,它处于Normal模式,我们这里就可以选择Debug模式了。更换模式之后,之前的Inspector视窗就变成了下面这样子:&/p&
&p&&figure&&img src=&http://pic3.zhimg.com/v2-fefb46a7a92_b.png& data-rawheight=&379& data-rawwidth=&453& class=&origin_image zh-lightbox-thumb& width=&453& data-original=&http://pic3.zhimg.com/v2-fefb46a7a92_r.png&&&/figure&这样,我们就可以既限制字段的访问权限又观察这些私有成员的变化了。&/p&
&br&&br&&h2&0x04 利用Scene视窗设置相机数据&/h2&
&p&&figure&&img src=&http://pic1.zhimg.com/v2-0da6e67d9b0f18ffb7d10_b.png& data-rawheight=&507& data-rawwidth=&959& class=&origin_image zh-lightbox-thumb& width=&959& data-original=&http://pic1.zhimg.com/v2-0da6e67d9b0f18ffb7d10_r.png&&&/figure&这是第一段视频中的第五个小技巧,我觉得这条技巧很受用。这次我们的工作情景变成了这样:对很多人来说,在场景视图中调整观察的角度、位置等等是一件十分简单的事情,但是如果真的要游戏中达到同样的效果,则必须去调整场景中的相机。&br&&figure&&img src=&http://pic1.zhimg.com/v2-974acea9f240c_b.png& data-rawheight=&625& data-rawwidth=&1240& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic1.zhimg.com/v2-974acea9f240c_r.png&&&/figure&(左侧是Scene视图,右侧是Game视图)&br&
相对来说,调整相机的过程更复杂,那么有没有什么方法能够直接让摄像机应用和Scene视图一样的设置呢?这条技巧就是关于这个的。 &/p&&p&首先选中场景中的摄像机,之后使用快捷键:&/p&
&blockquote&&p&shift + ctrl + f&/p&
&/blockquote&
&p&就可以把Scene视图中的数据复制给选中的摄像机了。&/p&&p&当然,除了使用快捷键,我们还可以在菜单中选择相应的操作。&/p&
&blockquote&&p&GameObject-&Align With View&/p&
&/blockquote&
&p&也可以达到相同的效果。&/p&&figure&&img src=&http://pic2.zhimg.com/v2-124cf4b4c2dd8eaff6bfa99_b.png& data-rawheight=&587& data-rawwidth=&1240& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic2.zhimg.com/v2-124cf4b4c2dd8eaff6bfa99_r.png&&&/figure&&br&&br&&h2&0x05 拓展编辑器&/h2&
&p&这一部分并非来自某一个技巧,而是和拓展编辑器相关的小技巧的集合。&br&
在Unity中拓展编辑器,往往需要用到C#的各种特性(attribute)。&br&
例如,我们可以使用&strong&[RangeAttribute]&/strong&在Inspector视窗上显示一个滑动条。&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[Range(0, 10)]
public int publicI
&/code&&/pre&&/div&
&p&&figure&&img src=&http://pic3.zhimg.com/v2-b5f5ffbba_b.png& data-rawheight=&93& data-rawwidth=&394& class=&content_image& width=&394&&&/figure&如果,我们嫌Inspector视窗上显示的各个字段太混乱没有章法,那么我们可以使用另外两个特性来帮助我们对显示在Inspector上的字段进行整理:&strong&[SpaceAttribute]&/strong&和&strong&[HeaderAttribute]&/strong&。&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#region 字段
[Header(&测试数据1&)]
[Range(0, 10)]
public int publicI
public bool publicB
public float publicF
public GameObject publicO
[Header(&测试数据2&)]
[Space(10)]
public List&GameObject& objsA
&/code&&/pre&&/div&
&p&这样,我们就可以为一堆字段分类显示了。&/p&
&p&&figure&&img src=&http://pic1.zhimg.com/v2-ad27a1ecd18_b.png& data-rawheight=&384& data-rawwidth=&379& class=&content_image& width=&379&&&/figure&如果,我们既想保证类的某个字段不被其他的类访问修改,又想在Inspector视窗中修改这个字段的值的话,就可以采用private +&br&
[SerializeField]属性的方案。&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[SerializeField]
private int privateI
&/code&&/pre&&/div&
&br&&br&&figure&&img src=&http://pic4.zhimg.com/v2-7fd107e697b3c86efd4b3_b.png& data-rawheight=&407& data-rawwidth=&376& class=&content_image& width=&376&&&/figure&&h2&0x06 快速设置视图最大化&/h2&
&p&&figure&&img src=&http://pic3.zhimg.com/v2-36a736b9e08c3ded880a_b.png& data-rawheight=&509& data-rawwidth=&960& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&http://pic3.zhimg.com/v2-36a736b9e08c3ded880a_r.png&&&/figure&这也是一个我感觉很有趣的小技巧,来自第二段视频的第一个技巧。&/p&&p&利用这个技巧,我们可以快速的在不同的视图中设置视图的最大化。&/p&&p&比如场景视图和游戏视图同时显示,我们想要将场景视图放到最大,只需要将鼠标悬停在场景视图上,并同时按下快捷键:&/p&
&blockquote&&p&shift + 空格&/p&
&/blockquote&
&p&就可以将场景视图设置为最大化。&figure&&img src=&http://pic4.zhimg.com/v2-40d6ad4ebc0bd5bf82407_b.png& data-rawheight=&626& data-rawwidth=&1240& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic4.zhimg.com/v2-40d6ad4ebc0bd5bf82407_r.png&&&/figure&&figure&&img src=&http://pic2.zhimg.com/v2-ae46cb3bdfe169dc9c076ebbc5826015_b.png& data-rawheight=&690& data-rawwidth=&1240& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic2.zhimg.com/v2-ae46cb3bdfe169dc9c076ebbc5826015_r.png&&&/figure&&/p&
&p&如果调整动画的话,Animator视图是必不可少的,如果要将&br&
Animator视图最大化也只需要把鼠标停在Animator视图上,同时按shift+空格快捷键。&/p&&p&不过在我的使用中,Game视图不能在运行时进行这种操作,必须在暂停状态或不在Play Mode时才起作用。&/p&
&br&&br&&h2&0x07 更好的预览模型&/h2&
&p&&figure&&img src=&http://pic1.zhimg.com/v2-3dd77cd3e14eca4d8228828c_b.png& data-rawheight=&493& data-rawwidth=&959& class=&origin_image zh-lightbox-thumb& width=&959& data-original=&http://pic1.zhimg.com/v2-3dd77cd3e14eca4d8228828c_r.png&&&/figure&这条技巧来自第二段视频的第十条,我相信它能够提供给我们在Editor中观察模型的更好的体验。&/p&&p&一个可能的工作情景是这样的,我们导入了一个模型,并希望在模型的Inspector视窗上预览该模型时,常常只能拘泥于这个角落。&/p&
&p&&figure&&img src=&http://pic1.zhimg.com/v2-a8ed0fe89d30_b.png& data-rawheight=&918& data-rawwidth=&659& class=&origin_image zh-lightbox-thumb& width=&659& data-original=&http://pic1.zhimg.com/v2-a8ed0fe89d30_r.png&&&/figure&想要看的更清楚、更大似乎只能拖动整个Inspector视窗。&/p&&p&其实,我们可以轻松的将模型预览的小窗口单独拖出来。只需要鼠标&strong&右键单击预览窗口的上沿&/strong&。&figure&&img src=&http://pic2.zhimg.com/v2-809aec0c19_b.png& data-rawheight=&232& data-rawwidth=&476& class=&origin_image zh-lightbox-thumb& width=&476& data-original=&http://pic2.zhimg.com/v2-809aec0c19_r.png&&&/figure& 不信?你看是不是放大了很多? &/p&&figure&&img src=&http://pic2.zhimg.com/v2-de6b5aa623e738edd60a9_b.png& data-rawheight=&852& data-rawwidth=&1240& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic2.zhimg.com/v2-de6b5aa623e738edd60a9_r.png&&&/figure&&br&&br&&h2&0x08 小结&/h2&
&p&以上,就是这次和大家分享的内容。&br&
场景以及模型资源来自:&a href=&http://link.zhihu.com/?target=https%3A//www.assetstore.unity3d.com/cn/%23%2521/content/35619& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Japanese Matsuri City&/a&&/p&
&p&原视频链接:&br&&a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DJDVuTBHnGWw& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TOP 10 UNITY TIPS&/a&&br&&a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DIHeMmFxvmkY& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TOP 10 UNITY TIPS #2&/a&&/p&
&p&-华丽的分割线-&/p&&p&欢迎大家关注我的公众号慕容的游戏编程:chenjd01&/p&&p&&figure&&img src=&http://pic3.zhimg.com/v2-bf9dba75fc90fa92fde0fe525bb7656e_b.png& data-rawheight=&400& data-rawwidth=&400& class=&content_image& width=&400&&&/figure&&br&
最后打个广告,欢迎支持我的书&a href=&http://link.zhihu.com/?target=https%3A//item.jd.com/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《Unity 3D脚本编程》&/a&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-aec4df4f86ae6a51ca6013e7deb5a9bc_b.jpg& data-rawheight=&668& data-rawwidth=&522& class=&origin_image zh-lightbox-thumb& width=&522& data-original=&http://pic1.zhimg.com/v2-aec4df4f86ae6a51ca6013e7deb5a9bc_r.jpg&&&/figure&
本文的内容主要来自YouTube播主Brackeys的视频TOP 10 UNITY TIPS 和TOP 10 UNITY TIPS #2。在此基础上经过自己的实践和筛选之后,选择了几个自己觉得还算有趣而平时又有所忽略的小技巧记录在此和各位分享。
0x01 编辑器染色 这也是这两段视频的…
UE官方文档有TA的一系列教程(我之前看的UE3)。&br&脚本语言我开始看的是C#图解教程。shader从节点开始连就好了,概念一定要了解。
UE官方文档有TA的一系列教程(我之前看的UE3)。 脚本语言我开始看的是C#图解教程。shader从节点开始连就好了,概念一定要了解。
&figure&&img src=&https://pic1.zhimg.com/v2-c25ecde49c5d857cdc7f8f7c3bf8cb8e_b.jpg& data-rawwidth=&1242& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&1242& data-original=&https://pic1.zhimg.com/v2-c25ecde49c5d857cdc7f8f7c3bf8cb8e_r.jpg&&&/figure&&h2&提要&/h2&
&p&在上一篇塞尔技术分析中,我们学习了角色的卡通渲染方法和生动的表情系统,今天要学习的是塞尔达中非常风格化的水体渲染。&/p&
&p&地牢中的水&/p&
&figure&&img src=&http://pic1.zhimg.com/v2-8cccd104e8_b.png& data-rawwidth=&1240& data-rawheight=&637& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic1.zhimg.com/v2-8cccd104e8_r.png&&&/figure&&p&大海的水&/p&
&figure&&img src=&http://pic3.zhimg.com/v2-c25ecde49c5d857cdc7f8f7c3bf8cb8e_b.png& data-rawwidth=&1242& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&1242& data-original=&http://pic3.zhimg.com/v2-c25ecde49c5d857cdc7f8f7c3bf8cb8e_r.png&&&/figure&&br&&h2&海洋表现&/h2&
&p&首先是水面的mesh。&/p&
&p&可以用程序生成,这里为了方便直接在Blender里面拉一个面出来。&/p&
&p&首先添加一个Plane,然后通过subdivide来分割。&/p&
&figure&&img src=&http://pic4.zhimg.com/v2-dba80ff6b94adb0552c7_b.png& data-rawwidth=&1020& data-rawheight=&433& class=&origin_image zh-lightbox-thumb& width=&1020& data-original=&http://pic4.zhimg.com/v2-dba80ff6b94adb0552c7_r.png&&&/figure&&p&导出之前要把uv分出来&/p&
&figure&&img src=&http://pic3.zhimg.com/v2-c3fec3cc7d075b509706_b.png& data-rawwidth=&823& data-rawheight=&436& class=&origin_image zh-lightbox-thumb& width=&823& data-original=&http://pic3.zhimg.com/v2-c3fec3cc7d075b509706_r.png&&&/figure&&p&海平面用到一张贴图,游戏中的水面的贴图大小是,同时用了4级的mipmap&/p&
&figure&&img src=&http://pic2.zhimg.com/v2-bafe2c789b5_b.png& data-rawwidth=&366& data-rawheight=&363& class=&content_image& width=&366&&&/figure&&br&&p&直接铺到mesh上是这样的&/p&
&figure&&img src=&http://pic1.zhimg.com/v2-38e89ad030fabb4cae964a18_b.png& data-rawwidth=&734& data-rawheight=&414& class=&origin_image zh-lightbox-thumb& width=&734& data-original=&http://pic1.zhimg.com/v2-38e89ad030fabb4cae964a18_r.png&&&/figure&&br&&p&通过调整水面贴图的uv坐标来达到波纹的效果。&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fixed4 frag (v2f i) : SV_Target
float2 uv = i.uv * 10.0 + float2(_Time.y
* -0.05, _Time.y
uv.y += 0.01 * (sin(uv.x * 3.5 + _Time.y
* 0.35) + sin(uv.x * 4.8 + _Time.y
* 1.05) + sin(uv.x * 7.3 + _Time.y
* 0.45)) / 3.0;
uv.x += 0.12 * (sin(uv.y * 4.0 + _Time.y
* 0.5) + sin(uv.y * 6.8 + _Time.y
* 0.75) + sin(uv.y * 11.3 + _Time.y
* 0.2)) / 3.0;
uv.y += 0.12 * (sin(uv.x * 4.2 + _Time.y
* 0.64) + sin(uv.x * 6.3 + _Time.y
* 1.65) + sin(uv.x * 8.2 + _Time.y
* 0.45)) / 3.0;
fixed4 tex1 = tex2D(_MainTex, uv * 1.0);
fixed4 tex2 = tex2D(_MainTex, uv * 1.0 + float2(0.2, 0.2));
float tmp = tex1.a * 0.9 - tex2.a * 0.02;
float4 col = fixed4(_MainColor.rgb + fixed3(tmp, tmp, tmp), 1.0);
&/code&&/pre&&/div&
&p&采了两次贴图,一个是白色的,一个是深蓝色的,用来表现层次感。&/p&
&figure&&img src=&http://pic4.zhimg.com/v2-af807aefc3a5562fcfcdda73d099ba7f_b.png& data-rawwidth=&732& data-rawheight=&410& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&http://pic4.zhimg.com/v2-af807aefc3a5562fcfcdda73d099ba7f_r.png&&&/figure&&p&接下来要实现的是海平面的高低起伏。&/p&
&p&主要的思路就是随机且连续的变换mesh上顶点的位置,有几种做法吧,一种是用噪声来处理,一种是叠加多个sin函数。&/p&
&p&这里采用叠加sin函数的方式来处理&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&float calculateSurface(float x, float z, float scale)
float y = 0.0;
y += (sin(x * 1.0 / scale + _Time.y * 1.0) + sin(x * 2.3 / scale + _Time.y * 1.5) + sin(x * 3.3 / scale + _Time.y * 0.4)) / 3.0;
y += (sin(z * 0.2 / scale + _Time.y * 1.8) + sin(z * 1.8 / scale + _Time.y * 1.8) + sin(z * 2.8 / scale + _Time.y * 0.8)) / 3.0;
v2f vert (appdata v)
v.vertex.z += _WaveStrength * calculateSurface(v.vertex.x, v.vertex.y, _WaveScale);
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o, o.vertex);
&/code&&/pre&&/div&&figure&&img src=&http://pic3.zhimg.com/v2-8edcbeeff788ee_b.png& data-rawwidth=&1756& data-rawheight=&984& class=&origin_image zh-lightbox-thumb& width=&1756& data-original=&http://pic3.zhimg.com/v2-8edcbeeff788ee_r.png&&&/figure&&br&&p&通过下面两个参数,可以调整波的振幅和频率&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&_WaveScale(&Wave Scale&, Float) = 0.1
_WaveStrength(&Wave Strength&, Float) = 0.1
&/code&&/pre&&/div&&br&&figure&&img src=&http://pic3.zhimg.com/v2-acf77ed3a81b822e5c1e_b.png& data-rawwidth=&1756& data-rawheight=&987& class=&origin_image zh-lightbox-thumb& width=&1756& data-original=&http://pic3.zhimg.com/v2-acf77ed3a81b822e5c1e_r.png&&&/figure&&br&&p&还有个简单的技术,其实link在开船的时候,船和海洋是不往前开的,动的是两旁的建筑和上面的小鸟,但在视觉上是发现不了的,这样就规避了海平面动态生成和销毁的问题。&/p&
&figure&&img src=&http://pic2.zhimg.com/v2-584b645f13bf0e2b84ae283d321f9b79_b.png& data-rawwidth=&602& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&602& data-original=&http://pic2.zhimg.com/v2-584b645f13bf0e2b84ae283d321f9b79_r.png&&&/figure&&br&&h2&河流瀑布&/h2&
&figure&&img src=&http://pic3.zhimg.com/v2-e92c5b80a05f0b341b3f3a_b.png& data-rawwidth=&501& data-rawheight=&352& class=&origin_image zh-lightbox-thumb& width=&501& data-original=&http://pic3.zhimg.com/v2-e92c5b80a05f0b341b3f3a_r.png&&&/figure&&br&&p&首先要实现的是河流主体,就是最简单的UV动画。&/p&&p&贴图是长这样的&/p&
&figure&&img src=&http://pic4.zhimg.com/v2-1acd3ee83e72cc7_b.png& data-rawwidth=&539& data-rawheight=&574& class=&origin_image zh-lightbox-thumb& width=&539& data-original=&http://pic4.zhimg.com/v2-1acd3ee83e72cc7_r.png&&&/figure&&br&&p&Mesh直接用一个Unity自带的quad。&/p&
&p&Shader的关键代码&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fixed4 frag(v2f i) : SV_Target
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv + fixed2(0, _FlowSpeed * _Time.y));
col = fixed4(_MainColor.rgb + 0.2f* fixed3(col.a, col.a, col.a), 1.0);
&/code&&/pre&&/div&
&figure&&img src=&http://pic3.zhimg.com/v2-7cbc3aba3e_b.png& data-rawwidth=&1132& data-rawheight=&635& class=&origin_image zh-lightbox-thumb& width=&1132& data-original=&http://pic3.zhimg.com/v2-7cbc3aba3e_r.png&&&/figure&&br&&p&接着来看一下岸边的水花&/p&
&p&主要分两个部分,一部分是竖着,贴在岸上的部分,一部分是贴在水面上的部分。Mesh还是用Unity的Quad,进行适当的缩放和旋转。&/p&
&p&然而仅仅是uv动画很难有那么好的效果。为了添加层次感和动态,首先是在shader中采两次贴图,将结果进行叠加,&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fixed4 frag (v2f i) : SV_Target
fixed flowX = _FlowSpeed * _Time.y;
fixed4 col = tex2D(_MainTex, i.uv - float2(flowX, 0))*_MainC
fixed4 col2 = tex2D(_MainTex, i.uv - float2(flowX *2, 0))*_MainC
return col + col2;
&/code&&/pre&&/div&&p&接下来还要做的是动态地调整贴图的Tiling,具体的实现就是在VS中利用_MainTex_ST算出两个uv值,传到fs中&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&o.uv = v.uv.xy * (_MainTex_ST.xy + fixed2(0, 0.17 * sin(_Time.y))) + _MainTex_ST.
o.uv2 = v.uv.xy * (_MainTex_ST.xy + fixed2(0, 0.13 * sin(_Time.y * 2)))+ _MainTex_ST.
&/code&&/pre&&/div&&br&&br&&p&&i&对于float4 _MainTex_ST:&/i&&/p&&p&&i&Yes, indeed for any texture property, Unity provides value for float4 with &_ST& suffix. The x,y contains texture scale, and z,w contains translation (offset).&/i&&/p&&br&&p&在fs中采出来&/p&
&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fixed4 frag (v2f i) : SV_Target
fixed flowX = _FlowSpeed * _Time.y;
fixed4 col = tex2D(_MainTex, i.uv - float2(flowX, 0))*_MainC
fixed4 col2 = tex2D(_MainTex, i.uv2 - float2(flowX *1.4, 0))*_MainC
return col + col2;
&/code&&/pre&&/div&&figure&&img src=&http://pic3.zhimg.com/v2-28baf3eadc4e6a702f268a_b.png& data-rawwidth=&1131& data-rawheight=&639& class=&origin_image zh-lightbox-thumb& width=&1131& data-original=&http://pic3.zhimg.com/v2-28baf3eadc4e6a702f268a_r.png&&&/figure&&br&&p&调一个结果&/p&
&figure&&img src=&http://pic1.zhimg.com/v2-8adeb067d3b19fee60bc_b.png& data-rawwidth=&1130& data-rawheight=&641& class=&origin_image zh-lightbox-thumb& width=&1130& data-original=&http://pic1.zhimg.com/v2-8adeb067d3b19fee60bc_r.png&&&/figure&&br&&h2&小结&/h2&
&p&可以看出在wind walker中,水体的表现主要是通过uv动画的方式来处理,外加一些sin函数来处理随机,这使得在Game Cube这样的低性能机器上也能得到很好的卡通水体的渲染效。&/p&
&br&&h2&参考&/h2&
&p&&a href=&http://link.zhihu.com/?target=https%3A//www.shadertoy.com/view/ltfGD7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Shadertoy&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//betterexplained.com/articles/intuitive-understanding-of-sine-waves/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intuitive Understanding of Sine Waves&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//http.developer.nvidia.com/GPUGems/gpugems_ch01.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chapter 1. Effective Water Simulation from Physical Models&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//polycount.com/discussion/98578/udk-zelda-water-shader-help& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[UDK] Zelda Water Shader Help&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//forum.unity3d.com/threads/the-legend-of-zelda-wind-waker-styled-water.298724/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Legend of Zelda: Wind waker styled water&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//medium.com/%40gordonnl/the-ocean-170fdfd659f1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&medium.com/@gordonnl/th&/span&&span class=&invisible&&e-ocean-170fdfd659f1&/span&&span class=&ellipsis&&&/span&&/a&&/p&
在上一篇塞尔技术分析中,我们学习了角色的卡通渲染方法和生动的表情系统,今天要学习的是塞尔达中非常风格化的水体渲染。
地牢中的水
首先是水面的mesh。
可以用程序生成,这里为了方便直接在Blender里面拉一个面出来。
&p&我曾经在 gamedev
tutplus 上面见过使用3d软件制作此类风格
主要是使用flat
以及简单上色
主要是渲染 技术&br&
&a href=&//link.zhihu.com/?target=http%3A//gamedevelopment.tutsplus.com/articles/go-beyond-retro-pixel-art-with-flat-shaded-3d-in-unity--gamedev-12259& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&gamedevelopment.tutsplus.com&/span&&span class=&invisible&&/articles/go-beyond-retro-pixel-art-with-flat-shaded-3d-in-unity--gamedev-12259&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//cgi.tutsplus.com/tutorials/secrets-to-creating-low-poly-illustrations-in-blender--cg-31770& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cgi.tutsplus.com/tutori&/span&&span class=&invisible&&als/secrets-to-creating-low-poly-illustrations-in-blender--cg-31770&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&当然还有reddit 上一篇讨论&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.reddit.com/r/gamedev/comments/1203mf/very_low_poly_art/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&reddit.com/r/gamedev/co&/span&&span class=&invisible&&mments/1203mf/very_low_poly_art/&/span&&span class=&ellipsis&&&/span&&/a&&/p&
我曾经在 gamedev tutplus 上面见过使用3d软件制作此类风格
主要是使用flat shading 模式 以及简单上色
主要是渲染 技术
当然还有reddit 上一篇讨论
&figure&&img src=&https://pic1.zhimg.com/v2-a6d71e8a6e4c52d1f9ed9c_b.jpg& data-rawwidth=&640& data-rawheight=&494& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-a6d71e8a6e4c52d1f9ed9c_r.jpg&&&/figure&大家好,我是&a href=&http://www.zhihu.com/people/1c499da853caa919c1b9e44cfede3855& data-hash=&1c499da853caa919c1b9e44cfede3855& class=&member_mention& data-hovercard=&p$b$1c499da853caa919c1b9e44cfede3855&&@邓佳迪&/a& ,网名在木,来自USC,&a href=&http://www.zhihu.com/people/044eb2b3d3f9af5d1adc5& data-hash=&044eb2b3d3f9af5d1adc5& class=&member_mention& data-title=&@李姬韧& data-hovercard=&p$b$044eb2b3d3f9af5d1adc5&&@李姬韧&/a&
的学弟。 &br&&br&最近呢要开始准备毕设了,着手研究了以下水墨风的渲染,也算是小有心得,在这里想和大家分享一下。作为程序猿的我写的东西可能有些偏技术,如果大家想看到更多关于游戏设计×心得体会×人生理想类型的文章,欢迎在评论区里召唤我的美女同学们。&br&&br&希望大家能够继续关注我们之后的游戏!&br&&br&作者:邓佳迪&br&链接:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/p/25&/span&&span class=&invisible&&339585&/span&&span class=&ellipsis&&&/span&&/a&&br&来源:知乎&br&著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。&br&&br&&figure&&img src=&http://pic1.zhimg.com/v2-7db8b110045def56b6814_b.png& data-rawwidth=&1024& data-rawheight=&128& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&http://pic1.zhimg.com/v2-7db8b110045def56b6814_r.png&&&/figure&&p&鸡年到了,在这里先送给大家一副年画,祝大家生活红红火火。&/p&&p&&figure&&img src=&http://pic4.zhimg.com/v2-cd21d8f3a1ffe4a8fcb2ec7_b.jpg& data-rawwidth=&720& data-rawheight=&404& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&http://pic4.zhimg.com/v2-cd21d8f3a1ffe4a8fcb2ec7_r.jpg&&&/figure&这张图可不是在木君用PhotoShop做的,而是在Unity里老老实实的写Shader渲染出来的哦。因为毕设需要走非主流国画风,所以最近一直在研究中国风的Shader。这幅闻鸡起舞也算是阶段性成果了吧。好了,废话不多说,让我们来看看这只水墨风的鸡是怎么做出来的吧。&/p&&br&&h2&&b&创意·Inspiration
&/b&&/h2&&p&第一步当然是到各大网站寻找一些好看的作品作为我们的参考,待会我们在Unity里面做起来也能有迹可循嘛。说到这里,大家是不是下意识的打开百度谷歌了呢。不!百度谷歌的图片搜索功能的效率十分低下,偶尔还会蹦出一些非主流的画风出来吓人。在这里,在木君给大家推荐Pinterest这个网站,检索效率非常高。下面是我在输入“Chinese Painting Chicken&后的一些检索结果:(图片来源为网络,侵权必删)&/p&&blockquote&&figure&&img src=&http://pic4.zhimg.com/v2-bfd9be49f17b_b.jpg& data-rawwidth=&392& data-rawheight=&800& class=&content_image& width=&392&&&/figure&鸡的动态非常好,浓墨部分很精彩,特别是尾巴的部分,看似简单的几笔就把鸡尾演绎得栩栩如生。仔细观察,浓墨部分是通过色彩深浅的变化来营造出层次的,在Unity内也可以通过透明度的变化来勾勒出鸡毛的层次,受教了!&br&&figure&&img src=&http://pic2.zhimg.com/v2-c203e5e595c456fa483a0d2f_b.jpg& data-rawwidth=&564& data-rawheight=&417& class=&origin_image zh-lightbox-thumb& width=&564& data-original=&http://pic2.zhimg.com/v2-c203e5e595c456fa483a0d2f_r.jpg&&&/figure&一个大大的鸡屁股 :[ ,鸡身部分淡墨的使用非常考究,通过墨水浸染加纸面纹理的方式,把鸡的身体描绘得十分写意。而鸡脖子那部分的留白,简直神来之笔。通过留白制造意境也是水墨风渲染可以借鉴的手法呢,学习啦!&br&&figure&&img src=&http://pic1.zhimg.com/v2-891bf4fa2c8_b.jpg& data-rawwidth=&403& data-rawheight=&600& class=&content_image& width=&403&&&/figure&这幅画的点在于纹理和笔触勾勒。纸张表面的特殊纹理会赋予画面一种很强烈的质感。在Shader的编写过程中叠加一个Overlay的质感图片可以达到这种效果。&/blockquote&&h2&&b&素材·Assets &/b&&/h2&&p&在Unity里做风格化的渲染其实就和PS差不多,都是素材堆砌加后期处理的过程。用过PS的同学们应该知道,好的素材是成功的一半,所以素材的重要性,不言而喻。&/p&&p&我们从3d模型找起。在这里我用的是Asset(tao) Store(bao)上的一组带动画的鸟的模型。下图中间那只公鸡就是我在渲染测试中使用的模型。&/p&&figure&&img src=&http://pic4.zhimg.com/v2-9d0afbaf688eb9497eeefb_b.jpg& data-rawwidth=&794& data-rawheight=&384& class=&origin_image zh-lightbox-thumb& width=&794& data-original=&http://pic4.zhimg.com/v2-9d0afbaf688eb9497eeefb_r.jpg&&&/figure&&figure&&img src=&http://pic2.zhimg.com/v2-e1fc4abfdba1_b.jpg& data-rawwidth=&634& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&634& data-original=&http://pic2.zhimg.com/v2-e1fc4abfdba1_r.jpg&&&/figure&&br&&p&另外,我还需要一些笔触,墨水痕迹以及纸面纸面质感的素材。当然这些素材是我在一边调试一边搜集的,这里先放几张出来,给大家找找感觉。&/p&&h2&&b&着色器·Shader&/b&&/h2&&p&接下来就到重头戏了!关于水墨风的shader怎么写,相信这个问题不少同学也曾经烦恼过,今天我就来展示一下我研究的成果吧。&/p&&br&&figure&&img src=&http://pic4.zhimg.com/v2-b910a20e7d886bba61c0d38b_b.jpg& data-rawwidth=&688& data-rawheight=&402& class=&origin_image zh-lightbox-thumb& width=&688& data-original=&http://pic4.zhimg.com/v2-b910a20e7d886bba61c0d38b_r.jpg&&&/figure&&br&&p&首先上一张原本的模型,这个模型是注重真实感的,就是给人一种想把这只鸡杀了煲鸡汤的感觉(在木君广东人的身份就这么暴露了吗O.O)。这个模型本身的质量很高,但是现在我们需要把它变成国画风。&/p&&p&综合网上的一些研究,国画风的着色器在编写方面有两个关键的部分:一个是边缘检测,就是给这只大公鸡描个黑边,把它的轮廓勾勒出来;一个是调色,一般会用到降低色阶,水墨画里的用色通常是很少的,色彩太丰富就不像画出来的啦。最后我还会介绍一下我进行后期质感处理的一些方法。&/p&&h2&&ul&&li&&b&边缘检测&/b&&br&&/li&&/ul&&br&&/h2&&p&边缘检测的原理非常简单,就是法线和视线的点乘。公式如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Edge = Dot( Normal , View );
&/code&&/pre&&/div&&p&大家想想越是物体边缘的地方,是不是法线(物体表面朝外的方向)和视线(观察者看向物体的方向)的夹角越接近90度?把法线和视线点成得到了一个边缘参数,这个参数越接近0说明该点越处于边缘。用这个原理,就可以把边缘的颜色描黑。在我们的工程中中描黑后的鸡模型就变成了这样:&/p&&br&&figure&&img src=&http://pic2.zhimg.com/v2-f28a9d085a9_b.jpg& data-rawwidth=&706& data-rawheight=&398& class=&origin_image zh-lightbox-thumb& width=&706& data-original=&http://pic2.zhimg.com/v2-f28a9d085a9_r.jpg&&&/figure&&br&&p&/*哇,光秃秃的可以做成白切鸡呢*/&br&&/p&&p&这样做出来的边缘有一个渐变的趋势,但是我们要的是描边,而不是渐变。所以我们需要对边缘参数设定一个阈值,并且把高于阈值的地方设定为白色,对低于阈值的地方进行一个平方的处理,公式如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&EdgeOpt = (Edge & thred)? 1 : Edge * E
&/code&&/pre&&/div&&p&效果图如下:&/p&&figure&&img src=&http://pic2.zhimg.com/v2-8ece13f00c5c0dc87ee48bd_b.jpg& data-rawwidth=&670& data-rawheight=&402& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&http://pic2.zhimg.com/v2-8ece13f00c5c0dc87ee48bd_r.jpg&&&/figure&&p&好像有那么点水墨的感觉了呢,如果加上原来的材质会是什么样的呢?&/p&&br&&p&&figure&&img src=&http://pic1.zhimg.com/v2-05dae2d6f6f8_b.jpg& data-rawwidth=&682& data-rawheight=&398& class=&origin_image zh-lightbox-thumb& width=&682& data-original=&http://pic1.zhimg.com/v2-05dae2d6f6f8_r.jpg&&&/figure&一只被勾了边的鸡出现了!但是鸡的颜色还是有些奇怪,一般的水墨画可没有这么斑斓的色彩,都是以极少的几种甚至是单种颜色构成的。为了让渲染的颜色更加接近于绘画,我们需要进行颜色的调节。&/p&&ul&&li&&b&调节颜色
&/b&&/li&&/ul&&br&&p&首先我们对贴图进行降低色阶的处理。所谓的降低色阶就是把贴图中相临近的颜色合并,以减少总的颜色数量。这里我们需要用到一个取整函数floor,简单来说,就是先把表示为0~1之间的颜色参数扩大,然后取整,相当于分组合并,最后把颜色参数再缩放到0~1,整个过程还是挺巧妙的。降低色阶的公式如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ColorPaint = floor( ColorTex * _Tooniness ) / _T
&/code&&/pre&&/div&&p&以下是效果图:&/p&&p&&figure&&img src=&http://pic3.zhimg.com/v2-baeacf2a0e232f097bc2_b.jpg& data-rawwidth=&642& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&642& data-original=&http://pic3.zhimg.com/v2-baeacf2a0e232f097bc2_r.jpg&&&/figure&/*哇,变成碳烧鸡了耶*/&/p&&p&色阶降低之后伴随的问题就是原本丰富的色块边缘被除掉,整个模型显得死板沉闷。这时候我们就需要引入一些带有质感笔触的图片,来增强色块边缘的质感。&/p&&p&这里可以和大家分享一下我找的图片。图片是从Pinterest上找的,我主要的目标是一些有大色块,并且有明显的纸张材质感和边缘笔触的图片。&/p&&p&&figure&&img src=&http://pic2.zhimg.com/v2-7a60d0f6cbe9_b.jpg& data-rawwidth=&424& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&424& data-original=&http://pic2.zhimg.com/v2-7a60d0f6cbe9_r.jpg&&&/figure&&figure&&img src=&http://pic1.zhimg.com/v2-26ad8647eb4afe136c743d960c5af200_b.jpg& data-rawwidth=&564& data-rawheight=&775& class=&origin_image zh-lightbox-thumb& width=&564& data-original=&http://pic1.zhimg.com/v2-26ad8647eb4afe136c743d960c5af200_r.jpg&&&/figure&之后就可以把找来的图片和现在的渲染颜色相叠加。叠加图片的思路大概是通过各种奇怪的算法算出一个新的uv值,然后再从图片中得到色彩值,再经过一系列奇怪的运算之后,得到最后的颜色值。和ps里的后期处理一样,都是通过不断的尝试和调整得到才会得到一个比较好的结果。如果实在想不出好的叠加函数,可以参考ps里的函数(柔光,强光等等)。&/p&&p&对黑边来说,我是用边缘参数和点的uv值进行线性的叠加得到的一个新uv参数,再把图片的颜色转化成透明度。效果图如下:&/p&&p&&figure&&img src=&http://pic3.zhimg.com/v2-acb01534bfeaed_b.jpg& data-rawwidth=&694& data-rawheight=&404& class=&origin_image zh-lightbox-thumb& width=&694& data-original=&http://pic3.zhimg.com/v2-acb01534bfeaed_r.jpg&&&/figure&模型的边缘可以看到有虚实的变化了,特别是尾巴的部分,显得更有层次感了。&br&&/p&&p&接下来我们对黑边以内的部分进行调整。这里我使用了一个小窍门,即用一个vector里的四个参数对一张图片进行缩放旋转处理。这个vector的xy可以作为二维偏差值,z可以作为旋转的角度,w可以是缩放值。这样就可以对加入的图片进行移位,旋转和缩放的调整了。&/p&&p&调整的效果如下:&/p&&p&&figure&&img src=&http://pic1.zhimg.com/v2-7fb33f5295a0ccd48cc950d813f9d8f4_b.jpg& data-rawwidth=&672& data-rawheight=&386& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&http://pic1.zhimg.com/v2-7fb33f5295a0ccd48cc950d813f9d8f4_r.jpg&&&/figure&&figure&&img src=&http://pic2.zhimg.com/v2-36c42d5a8271fdd68e642bede1704c55_b.jpg& data-rawwidth=&602& data-rawheight=&392& class=&origin_image zh-lightbox-thumb& width=&602& data-original=&http://pic2.zhimg.com/v2-36c42d5a8271fdd68e642bede1704c55_r.jpg&&&/figure&&figure&&img src=&http://pic3.zhimg.com/v2-7e8ef3f4874d80bec878a_b.jpg& data-rawwidth=&678& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&678& data-original=&http://pic3.zhimg.com/v2-7e8ef3f4874d80bec878a_r.jpg&&&/figure&可以看到内部的颜色也出现了一些笔触,并且有留白,留白部分是透明的。&br&&/p&&p&此外,对比参考图片,我们发现鸡的冠以及下巴上的胡会被画上红色,而鸡脖子的部分会留白,尾部会用黑色来描绘,以下是我参考图片做的渲染,其中叠加的纹理图片是根据贴图来制作的。&/p&&br&&p&&figure&&img src=&http://pic2.zhimg.com/v2-cc7bac6caf71e1dc5694b25_b.jpg& data-rawwidth=&688& data-rawheight=&388& class=&origin_image zh-lightbox-thumb& width=&688& data-original=&http://pic2.zhimg.com/v2-cc7bac6caf71e1dc5694b25_r.jpg&&&/figure&/*我闻到了浓浓的乌鸡汤的味道!*/&/p&&p&这种方法涉及到对于单个模型贴图的编辑,相当于美工给模型画贴图,泛用性比较差,仅供大家参考。&/p&&h2&&ul&&li&&b&整理·Finalization&/b&&/li&&/ul&&/h2&&p&接下来是P图时间!我们需要利用一些滤镜对画面进行最后的修改。比如可以用Scree Overlay来做纸张的纹理,用Color Correction来提高饱和度。最后配上几个装逼用的文字,播放鸡奔跑的动画,就大功告成了。&/p&&figure&&img src=&http://pic4.zhimg.com/v2-cd21d8f3a1ffe4a8fcb2ec7_b.jpg& data-rawwidth=&720& data-rawheight=&404& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&http://pic4.zhimg.com/v2-cd21d8f3a1ffe4a8fcb2ec7_r.jpg&&&/figure&&figure&&img src=&http://pic3.zhimg.com/v2-56049aad14a14bd46f54acae_b.jpg& data-rawwidth=&1036& data-rawheight=&898& class=&origin_image zh-lightbox-thumb& width=&1036& data-original=&http://pic3.zhimg.com/v2-56049aad14a14bd46f54acae_r.jpg&&&/figure&&figure&&img src=&http://pic1.zhimg.com/v2-426b6eeae0b33cc135ec4ac_b.jpg& data-rawwidth=&942& data-rawheight=&848& class=&origin_image zh-lightbox-thumb& width=&942& data-original=&http://pic1.zhimg.com/v2-426b6eeae0b33cc135ec4ac_r.jpg&&&/figure&&br&&h2&&ul&&li&&b&参考·Reference&/b&&/li&&/ul&&/h2&&p&在边缘检测方面,我的主要参考文章是下面这篇。原文发在facebook上,作者是Hui-Ku Shih。我引用了一篇转载的,传送门如下:&/p&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//www.mofang.com.tw/unity/79782.html& target=&_blank& rel=&nofollow noreferrer&&Unity Shader 05: 空間中的魔法參數 view direction&/a&&p&原文还附赠了一个可下载的.shader文件,是存在google drive上的。翻墙有困难的同学别着急,我会在文章的最后附上我自己的shader。&br&&/p&&p&另外我还参考了一篇卡通风渲染的文章,用了里面的降色阶的代码。传送门如下:&/p&&a class=& wrap external& href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/candycat1992/article/details/& target=&_blank& rel=&nofollow noreferrer&&【Unity Shader实战】卡通风格的Shader(一)&/a&&p&最后就是分享我写的Shader了,在木君已经把它打包成一个UnityPackage供大家使用!&/p&&a class=& wrap external& href=&http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1kU5yb1H& target=&_blank& rel=&nofollow noreferrer&&【在木的游戏作坊】水墨风闻鸡起舞&/a&&p&提取密码:sy6j&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//github.com/AtwoodDeng/ChinesePaintingDemo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Github 地址&/a&&/p&以下是我的公众号的二维码,欢迎关注哦!&figure&&img src=&http://pic1.zhimg.com/v2-7db8b110045def56b6814_b.png& data-rawwidth=&1024& data-rawheight=&128& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&http://pic1.zhimg.com/v2-7db8b110045def56b6814_r.png&&&/figure&&p&&a href=&http://link.zhihu.com/?target=http%3A//weixin.qq.com/r/ZkSLk6TEm-nkreDw9xF0& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&weixin.qq.com/r/ZkSLk6T&/span&&span class=&invisible&&Em-nkreDw9xF0&/span&&span class=&ellipsis&&&/span&&/a& (二维码自动识别)&/p&&p&公众号名称:在木的游戏作坊&/p&
大家好,我是 ,网名在木,来自USC, 的学弟。 最近呢要开始准备毕设了,着手研究了以下水墨风的渲染,也算是小有心得,在这里想和大家分享一下。作为程序猿的我写的东西可能有些偏技术,如果大家想看到更多关于游戏设计×心得体会×人生理想…
&figure&&img src=&https://pic1.zhimg.com/v2-091a98a3c560f8beff9cc7_b.jpg& data-rawwidth=&1024& data-rawheight=&657& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic1.zhimg.com/v2-091a98a3c560f8beff9cc7_r.jpg&&&/figure&&h2&0x00 前言:&/h2&&p&自从年底换了公司之后已经有一段时间没有写博客了。可能是这段时间工作的更愉快了,所谓“业精于勤,而荒于嬉”吧(此处有表情)。这周终于意识到了这点,看来还是要恢复之前写博客的状态。今天就来写写游戏引擎和脚本编程的话题吧。&/p&&h2&0x01 游戏脚本,用还是不用?&/h2&&p&这是一个问题?&br&游戏开发提供对脚本的支持可谓源远流长。&figure&&img src=&https://pic1.zhimg.com/v2-4bba697cec_b.jpg& data-rawwidth=&1000& data-rawheight=&562& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic1.zhimg.com/v2-4bba697cec_r.jpg&&&/figure&&/p&&p&2002年的无冬之夜,玩家可以方便的开发Mod。&figure&&img src=&https://pic1.zhimg.com/v2-efc75c5fb2cb08b1a97e0af_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic1.zhimg.com/v2-efc75c5fb2cb08b1a97e0af_r.jpg&&&/figure&2005年的黑与白2,按照剧本演绎大电影的感觉。&br&&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-4c75d865aa39ca650cfd_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic1.zhimg.com/v2-4c75d865aa39ca650cfd_r.jpg&&&/figure&2011年的老滚5,玩家可以方便的开发自己的Mod,生命力直到6年后的现在依然旺盛。&br&&/p&&p&当然,让更多人知道游戏脚本的是网络游戏的兴起。&figure&&img src=&https://pic1.zhimg.com/v2-adbf4bf4c4b3effce57efb_b.jpg& data-rawwidth=&1600& data-rawheight=&1200& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&https://pic1.zhimg.com/v2-adbf4bf4c4b3effce57efb_r.jpg&&&/figure&&/p&&br&开发网络游戏的插件或是外挂,游戏脚本总是要打交道的。&br&&p&好像大家都在使用脚本开发游戏。&/p&&h2&0x02 什么是游戏脚本&/h2&&p&&figure&&img src=&https://pic3.zhimg.com/v2-99fe739552baf_b.jpg& data-rawwidth=&300& data-rawheight=&225& class=&content_image& width=&300&&&/figure&使用c/c++开发项目,随着项目的扩大,源码的编译时间也会越来越长。有时修改一些常量就需要重新编译整个项目。是否感觉到了痛苦?&/p&&p&见招拆招,为了解决这个问题,可以将很多常量放到一个初始化文件中。并且编写一段代码去读取并解析这个文件。这样,常量就以初始化文件/配置文件的形式独立出来了。修改常量的值再也不用重新编译整个项目了!&/p&&p&这就是一个最初级的游戏脚本!而且初始化文件中的文本就是最基本的游戏脚本语言。&/p&&p&但是,仅仅是提供一些常量的读取和解析似乎还不能够满足游戏开发的需求,为了提高游戏开发的效率,节约编译c/c++项目时泡咖啡的时间,更高级的游戏脚本语言显然有必要引入。&figure&&img src=&https://pic3.zhimg.com/v2-f17198befbb4a1ba39681b_b.jpg& data-rawwidth=&560& data-rawheight=&314& class=&origin_image zh-lightbox-thumb& width=&560& data-original=&https://pic3.zhimg.com/v2-f17198befbb4a1ba39681b_r.jpg&&&/figure&So,更高级的脚本语言增加了脚本和c/c++的交互性,我们不但可以初始化变量,而且可以创建游戏逻辑甚至时游戏对象。&br&&/p&&p&游戏脚本的运行通过虚拟机来进行,我们使用脚本语言的语法编写的函数可以被虚拟机读取并运行。换言之,脚本可以通过虚拟机与c/c++进行通信,使得数据可以在两者之间来回传递。&/p&&p&脚本可以是解释执行的,也可以是编译执行的。解释执行的脚本通过解释器,逐行的读取、解析和执行。但是,为了节约在运行时的开销,一些解释执行的脚本会自动编译脚本。Lua便是其中的代表。&figure&&img src=&https://pic3.zhimg.com/v2-22099ea6edee4a2aa2b72c_b.jpg& data-rawwidth=&300& data-rawheight=&300& class=&content_image& width=&300&&&/figure&&/p&&p&当然,脚本还可以是编译执行的。编译执行的脚本是通过这种脚本语言的编译器编译为某种形式的中间语言(IL)的脚本。虚拟机是可以直接执行这种中间语言的。&br&这种中间语言是平台无关的,换言之,这种中间语言是供虚拟机使用的,而不关心具体的平台。&/p&&p&例如现在很流行的Unity引擎所使用的C#语言。&figure&&img src=&https://pic1.zhimg.com/v2-ef9688adbfc484ae84e7_b.jpg& data-rawwidth=&494& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&494& data-original=&https://pic1.zhimg.com/v2-ef9688adbfc484ae84e7_r.jpg&&&/figure&&br&&/p&在使用Unity开发游戏的过程中,脚本代码的编译只需要分为两部分就可以了:&br&第一部分是从C#代码本身到CIL的编译(其实之后 CIL还会被编译成一种位元码,生成一个 CLI assembly);&br&第二部分 是运行时从 CIL(其实是 CLI assembly,不过为了直观理解,此处不必纠结这种细节)到本地 指令的即时编译(这就引出了为何 Unity 3D官方没有提供热更新的原因:在 iOS平台中 Mono 无法使用 JIT 引擎,而是以 Full AOT 模式运行的,所以此处说的即时编译不包括 iOS 平台)。&br&&h2&0x03为什么要使用脚本?&/h2&&h4&便捷的初始化文件:&/h4&&p&最简单的应用便是我们可以使用脚本作为初始化文件,这是一个读入/修改游戏数据快速而方便的方法。&figure&&img src=&https://pic4.zhimg.com/v2-0b8a08de1c0c9c2b005fe8e62f7932fd_b.jpg& data-rawwidth=&1928& data-rawheight=&1052& class=&origin_image zh-lightbox-thumb& width=&1928& data-original=&https://pic4.zhimg.com/v2-0b8a08de1c0c9c2b005fe8e62f7932fd_r.jpg&&&/figure&&br&&/p&&br&&h4&节约游戏开发的时间,提高效率:&/h4&&p&随着游戏规模的日益庞大,C/C++代码的编译时间会越来越久。一些需要经常调试的功能如果每次修改都编译一遍整个项目,无疑会造成效率的地下。例如ai程序员,常常需要调试查看效果。因此如果都在C/C++中实现,会造成效率的低下。设想一下像辐射4这样的大型沙盒游戏,如果每次调试修改游戏逻辑都要重新编译C/C++代码,其开发效率无疑会降低很多。&figure&&img src=&https://pic3.zhimg.com/v2-e6ca7c2da40e3a3b1d2862c37cea27f7_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic3.zhimg.com/v2-e6ca7c2da40e3a3b1d2862c37cea27f7_r.jpg&&&/figure&&br&&/p&&br&&h4&降低了编程的门槛,提高了创造性:&/h4&&p&不可否认的一点,一些脚本语言比C/C++更高级,这主要体现在语法更加直观、上手更加容易。因此,一些非程序员也可以使用脚本语言来实现自己的需求。&br&当然,另一方面来说更容易招到初级程序员。不过,我认为这同时也导致了另外一个问题,即很多程序员因此成为了API搬运工,只知其然而不知其所以然。&figure&&img src=&https://pic1.zhimg.com/v2-28dcfc1bfe6a8f57acf60190_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic1.zhimg.com/v2-28dcfc1bfe6a8f57acf60190_r.jpg&&&/figure&&br&&/p&&br&&h4&带来了拓展性,Mod:&/h4&&p&使用脚本语言,游戏开发商可以把游戏引擎的功能交给玩家。反过来,通过玩家创造的Mod又为游戏提供了新的生命力。&br&这方面老滚5是一个经典的例子。11年发售的老滚5由于其拓展性,生命力十分顽强。&figure&&img src=&https://pic4.zhimg.com/v2-d3be861e7e6c_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic4.zhimg.com/v2-d3be861e7e6c_r.jpg&&&/figure&&br&&/p&&br&&h2&0x04 游戏开发中脚本的常见使用场景&/h2&&h4&对话流&/h4&&figure&&img src=&https://pic2.zhimg.com/v2-b531ffa876e266b0b3523b8_b.jpg& data-rawwidth=&1350& data-rawheight=&759& class=&origin_image zh-lightbox-thumb& width=&1350& data-original=&https://pic2.zhimg.com/v2-b531ffa876e266b0b3523b8_r.jpg&&&/figure&使用脚本来管理游戏中的对话是一个最常见的应用。这类脚本常常随某个特定的事件而触发。例如场景设计师设计主角在靠近某个NPC时触发和该NPC的对话。对话内容可以直接由场景设计师来制作。&br&&h3&舞台设计&/h3&&figure&&img src=&https://pic1.zhimg.com/v2-d9bdca8141_b.jpg& data-rawwidth=&1024& data-rawheight=&797& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic1.zhimg.com/v2-d9bdca8141_r.jpg&&&/figure&脚本在游戏中常见的一个应用还包括设计舞台。通过脚本来控制游戏场景中的对象和各种事件可以营造出很有沉浸式的游戏场景。&br&这里游戏脚本就十分类似电影的剧本。&br&&h3&玩法逻辑&/h3&&figure&&img src=&https://pic1.zhimg.com/v2-9f9a54e49bf6c7ccf109f3_b.jpg& data-rawwidth=&1440& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1440& data-original=&https://pic1.zhimg.com/v2-9f9a54e49bf6c7ccf109f3_r.jpg&&&/figure&由于逻辑开发需要经常的调试,如果每次代码修改都要进行一次冗长的重新编译,这会造成工作效率和开发人员身体健康的下降。因此使用脚本可以避免这一点。&br&&h2&0x05 后记&/h2&&p&好了,关于游戏编程和游戏脚本的话题暂时先告一段落。在下一篇文章中我们就来聊聊使用Unity游戏引擎开发游戏的过程中和游戏脚本有关的话题吧。&/p&&p&欢迎大家关注我的公众号“慕容的游戏编程”:chenjd01&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ce71b8c86ed04d665d784dcb98094d43_b.jpg& data-rawwidth=&400& data-rawheight=&400& class=&content_image& width=&400&&&/figure&&br&&br&最后打个广告,欢迎支持我的书&a href=&https://link.zhihu.com/?target=https%3A//item.jd.com/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《Unity 3D脚本编程》&/a&~&figure&&img src=&https://pic2.zhimg.com/v2-5dd4b158fa2e980fcc840ba859d10e10_b.jpg& data-rawwidth=&296& data-rawheight=&398& class=&content_image& width=&296&&&/figure&
0x00 前言:自从年底换了公司之后已经有一段时间没有写博客了。可能是这段时间工作的更愉快了,所谓“业精于勤,而荒于嬉”吧(此处有表情)。这周终于意识到了这点,看来还是要恢复之前写博客的状态。今天就来写写游戏引擎和脚本编程的话题吧。0x01 游戏脚…
&p&(本文根据我博客上的文章&a href=&https://link.zhihu.com/?target=http%3A//www.klayge.org/%3Fp%3D3560& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&跨平台shader编译的过去、现在和未来&/a&改写。知乎编辑器不支持多个级别的标题,以至于我只能用加粗不加粗来区分了。。。)&br&&/p&&p&很多跨平台游戏引擎都有统一shader的需求。比如KlayGE从建立伊始,就强调一份代码跨多个平台,shader代码也不例外。如果需要对不同平台都分别写一遍shader,那样的工作量和可维护性都很糟糕。&/p&&p&既然有这样的需求,就必然会在技术上遇到一个问题,如何把一份代码编译成不同API上的shader。从目前的API上,我们至少需要应对HLSL/GLSL/ESSL,以后还有Vulkan加入战团。这里就打算探讨一下跨平台shader编译的情况,希望对大家有启发意义。&/p&&h2&&b&过去&/b&&/h2&&p&刚有shader高级语言的时候,Cg是几乎唯一的shader语言。后来才在D3D9时代衍生出了HLSL,再往后有了GLSL和ESSL。所以自然而然一开始都会从Cg入手。在KlayGE发展的过程中,这还分为两个阶段。&/p&&h3&运行中使用Cg&/h3&&p&因为早期的Cg和HLSL几乎一样,我的做法是用HLSL写shader,在D3D上用HLSL编译器编译,OpenGL上用Cg编译器编译。遇到Cg不支持的个别语法,就用#ifdef隔开。一开始这个做法工作得还不错,得益于Cg的跨平台,Windows和Linux都能用全套Cg
runtime来跑。不管是编译还是设置状态还是渲染,都通过Cg来实现。这样的系统工作流如下。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-f8dc3dd64d9a2d63a62b99_b.jpg& data-rawwidth=&694& data-rawheight=&639& class=&origin_image zh-lightbox-thumb& width=&694& data-original=&https://pic4.zhimg.com/v2-f8dc3dd64d9a2d63a62b99_r.jpg&&&/figure& 图中模糊边缘的组件表示比较不可靠的组件。比如有性能问题,或缺乏社区支持,或已经停止开发。后同。&/p&&p&这个做法的缺点也很明显。&/p&&ul&&li&&b&问题1&/b&,不支持AMD和Intel的显卡。当时Cg对OpenGL的支持是通过把Cg编译成GL的asm来实现的。而这个过程直接用到了NV的扩展,在其他厂商的卡上跑不了。&/li&&li&&b&问题2&/b&,CPU端的性能损失。即便在NV的卡上,用Cg runtime也会带来一定得性能损失。虽然随着Cg的升级,这个损失在一点点减少。但比起直接用API的,总是慢一截。&/li&&li&&b&问题3&/b&,发展速度。到了D3D10时代,HLSL和GLSL都

我要回帖

更多关于 微信抢红包神器2017版 的文章

 

随机推荐