单机游戏怎么反汇编工具

谁能猜到这是啥游戏【单机游戏吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,417,822贴子:
谁能猜到这是啥游戏
移植到手机上去了
FC,重装机兵。
手机下个模拟器不就可以玩了,还移植干嘛?
有没人反汇编这游戏的代码什么的…特想知道那些烂尾的剧情到底会怎样发展…
重装机兵,很喜欢这个
fc时代最喜欢的游戏
一代神作,童年的回忆
我的内心毫无波动,甚至还背出了出师表,【图片】先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。   宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。   侍中侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。   将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。   亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。   臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。   先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。   愿陛下托臣以讨贼兴复之效,不效则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。   今当远离,临表涕零,不知所言。
重装机兵,当年卡带保存有问题,经常打到后面丢失存档,后来肛了一周没关我的小霸王...终于通关了
最喜欢的几个回合制之一
我记得小时候把诺亚打败它就把我送走,貌似诺亚打不死
重装机兵 我小时候的神作了
神级游戏,小时候这游戏和机战二都是我特别喜欢的FC游戏。
后面3p不开车不要太吊
重装机兵,满满的童年回忆!
贴吧热议榜
使用签名档&&
保存至快速回贴有不有大神科普一下单机游戏破解的原理和盗版联机的原理【显卡吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,377,200贴子:
有不有大神科普一下单机游戏破解的原理和盗版联机的原理收藏
11级了,总得懂点什么,天天说4路泰坦在卡巴也混不久,有点慌,;来取经了
「天猫七夕节」全球来电-电脑 显卡,家电满,美家2件75折,部分类目还可先享后付!「天猫七夕节」全球来电,因爱&惠&七夕,尽享大牌好货!
二楼 steamID:tujifengbao我为自己代言
太烦不说没有E3没有970没有四路泰坦这还是卡吧?
不就是改steamapi.dll嘛。其他类似,跳过验证部分,直接执行程序,骗游戏说是离线模式
这几天在卡巴看不到了科普的帖子,感觉很爽啊,我也来带带风气
反正都是违法
程序执行都是初始化后线性执行的,正常验证过程也含在里面,破解的目标就是模拟这一过程或者跳过这一过程。最老的反汇编方法就是找到执行位,直接添加goto跳过验证的过程。但是对于有平台验证的,如steam. uplay等就不奏效了。因为这类游戏不只是在初始化执行阶段有验证,可能在游戏过程中都有,或者平台本身就为游戏提供功能(如存档,联机模式)。因此,这类破解方法使用模拟的方法,修改出平台的核心组件,使其能够支持验证,存档等功能。联机是不可能的,单机破解只能在单机范围内
反正只买正版,不关心,不操心
武装突袭怎么联机?正版的
显卡,企业会员专享价,部分2件5折,注即可领新人礼包,中秋福利提前购!显卡,企业询价,批量采购更优惠,一站式本地化购平台,为企业提供多样化采购方案!
目测单机破解是骗游戏说你在离线模式,联机破解就是游戏每次都要连到主服务器,然后破解就是伪造一个主服务器然后让游戏每次都连到那上面
关键不知道去哪买正版怎么办
登录百度帐号10添加评论分享收藏感谢收起最近也做过这方面的事情,实现了定点数纯量和矢量运算。三角函数可用45度以内的查找表,比较麻烦的是开平方和指数等。&br&&br&另外要注意定点数较容易溢出,例如两个32位定点数二维矢量的点积是65位纯量,我对于一些算法会直接使用64位结果,例如圆形相交测试是比较64位的平方距离。&br&&br&我之后再补一些参考资料吧。&br&&br&----&br&更新&br&&br&关于定点数运算基础,可参考课件 [1] 。定点数开平方的常用算法是 [2]。对数可参考[3]及一个开源实现。[4] 第18章有反正切的近似值算法。在 SO 上也有一些讨论,如:&br&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/questions/6286450/inverse-sqrt-for-fixed-point& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&math - Inverse sqrt for fixed point&/a&&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/questions/4657468/fast-fixed-point-pow-log-exp-and-sqrt%3Frq%3D1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&c++ - Fast fixed point pow, log, exp and sqrt&/a&&br&&/li&&/ul&&br&[1] Lauha, Jetro. &The neglected art of Fixed Point arithmetic.& Retrieved August 12 (2006): 2011. ftp://chiptune.untergrund.net/users/in4kadmin/files/The_neglected_art_of_Fixed_Point_arithmetic_.pdf&br&[2] Turkowski, Ken. &Fixed point square root.& Apple Computer, Inc., Tech. Rep 96 (1994).
&a href=&//link.zhihu.com/?target=http%3A//www.realitypixels.com/turk/computergraphics/FixedSqrt.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&realitypixels.com/turk/&/span&&span class=&invisible&&computergraphics/FixedSqrt.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&[3]
C. S. Turner,
&A Fast Binary Logarithm Algorithm&, IEEE Signal Processing Mag., pp. 124,140, Sep. 2010. &a href=&//link.zhihu.com/?target=https%3A//github.com/dmoulding/log2fix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - dmoulding/log2fix: Fixed-point base 2 logarithm algorithm implementation in C; includes added base e and base 10 support, too.&/a&&br&[4] Lyons, Richard G., ed. &i&Streamlining digital signal processing: a tricks of the trade guidebook&/i&. John Wiley & Sons, 2012.
最近也做过这方面的事情,实现了定点数纯量和矢量运算。三角函数可用45度以内的查找表,比较麻烦的是开平方和指数等。 另外要注意定点数较容易溢出,例如两个32位定点数二维矢量的点积是65位纯量,我对于一些算法会直接使用64位结果,例如圆形相交测试是比…
游戏开发涉及到逻辑运算的时候,所有前辈都会告诉你,不要用浮点数,浮点数是邪恶的。&br&&br&我在开发有回放系统的 rts 游戏的时候,就用 c# 实现过一套简单的定点数,基本思路就是 32 位的整数中,前 16 位用来存储小数,后 16 位用来存储整数。但在做乘法的时候会溢出,所以得使用 int64,而且表示的定点数范围只有在(-6) 之间才是安全的,超出这个范围的数值在做乘法运算的时候可能会溢出。总的来说想要自己编写一个效率和鲁棒性都很高的定点数基本上来说是一件非常非常难的事情。我的定点数在使用的时候还要小心翼翼的提醒自己,确定这里的数值不会很大,所以不会溢出吧。不过对于一个 RTS 游戏来说, 最大值 65535 已经够用了,所以一直用着都没啥问题,也用该定点数做出过回放的功能。 我参考了&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/a/8225& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fixed point math in c#?&/a& 的回答,但该代码中的 sqrt 非常慢,以至于我最后不得不自己用牛顿迭代法写了一个,而且其中的 sin 和 cos 函数也有问题,测下来发现误差巨大,最后也是自己用线性插值的查表方法重新写了一个。
游戏开发涉及到逻辑运算的时候,所有前辈都会告诉你,不要用浮点数,浮点数是邪恶的。 我在开发有回放系统的 rts 游戏的时候,就用 c# 实现过一套简单的定点数,基本思路就是 32 位的整数中,前 16 位用来存储小数,后 16 位用来存储整数。但在做乘法的时候…
&p&很多人谈了很多方面,而我认为最核心的只有一点&/p&&p&&b&对个人而言没有可持续发展性。&/b&&/p&&p&上一个产品的成功,并不意味着下一个产品的成功,你认为的各种成功的经验,大多数时候只符合你产品成功的那个时间点,而下一个时间点,你的经验将变成束缚,所以你面对的永远都是未知,对老板来说,每一次都是豪赌,对就职者来说,也是赌,赌资就是机会成本和时间成本。&/p&&p&在技术上没有门槛,天花板太低,导致你不能象医生那样持续建立自己的优势,行业内通用技术积累多数五年内可以完成,剩下的是对某些特定引擎或工具的技术积累,但这些东西推陈出新的速度太快,建立的优势在短时间内(如五年)会不断的被重置, 所以导致一种现象,你在这行业做了十年,但你的优势并不会比在这个行业做了五年的多出太多。&/p&&p&&/p&
很多人谈了很多方面,而我认为最核心的只有一点对个人而言没有可持续发展性。上一个产品的成功,并不意味着下一个产品的成功,你认为的各种成功的经验,大多数时候只符合你产品成功的那个时间点,而下一个时间点,你的经验将变成束缚,所以你面对的永远都是…
从我自己3A开发程序的经验来简单回答一下这个问题,本人有幸在微软343 industries参与了引擎和管线的制作(光环5),也有幸在索尼santa monica studio参与了gameplay的制作(新战神),算是参加过游戏开发的几个主要领域了,实际上游戏开发程序的工作主要分为三大块:gameplay,pipeline和引擎,这三块都有自己的难点和重点,下面分别稍微解释一下,解释之前,一个短小的结论,游戏开发的程序是软件开发中比较难的一块。&br&&br&1: gameplay,gameplay程序的难点在于,解决的问题非常广泛,从fps游戏里面的枪械,车辆,到战神里面的斧头,怪兽,再到uncharted 4里面的绳子,根据游戏的类型,需要解决的问题几乎涉猎所有领域,这对gameplay程序来说是一个很大的挑战。gameplay程序从技术的角度来说需要保证系统能运行,还需要很强的对游戏的理解,做出来的东西保证好玩,这就不是一个纯粹的技术问题了,需要本身对制作游戏的类型非常了解。另外gameplay程序特别是3d游戏的gameplay对数学的要求很高,还要求非常善于和策划还有美术动画沟通,最难最烦人的一点gameplay都不是一次性完工的,需要大量的推翻,迭代,重做,如何在质量和迭代速度之间找到平衡也是一大难点。gameplay是最靠近玩家的程序。&br&&br&2: pipeline,中文大家都把这个叫管线,基本上就是工作室内部用来制作游戏的所有工具,流水线的总称。这类程序打交道的主要对象就是自己工作室内部的各种开发人员,从美术,策划到动画,特效等等,他们对大型游戏开发非常非常重要,他们保证了开发流程的高效进行,他们开发的工具,流水线,包括小到bake light map的工具,给策划调整数据的工具,大到关卡编辑器,build system,等等,好的工作室和差的工作室的一大差距就是内部的管线先进性,我的弟弟&a href=&//www.zhihu.com/people/ae070b3ae& data-hash=&ae070b3ae& class=&member_mention& data-hovercard=&p$b$ae070b3ae&&@Ryan槐宏武&/a&是顽皮狗的引擎程序,顽皮狗的内部管线相当先进。这一类程序需要和gameplay部门打交道,需要和美术,动画等部门打交道,还需要和引擎程序打交道,需要满足内部用户的需求,也需要解决底层的技术,要求也非常高。很多工作室管线开发属于引擎组。&br&&br&3: 引擎程序(runtime)。这一类程序离玩家用户最远,技术的专业程度最高,对纯程序技能,底层优化都非常要求高,专业技能最窄但是最专精。渲染引擎需要你懂底层的计算机优化和图形的相关知识,物理引擎需要你物理知识和底层优化,动画引擎需要动画知识和底层优化,等等,一般这种底层的系统和gameplay最大的区别就是,他们实现的时间较长,跌倒的次数较少,但是非常非常稳定和高质量,引擎基本上是一个游戏的基石,是最核心最核心的技术。&br&&br&综合来说,这三个领域的程序,基本上不能简单的说“某一个比某一个难”,“某一个比某一个重要”,根据程序员自己的性格,技能,按照需求分配,才是最优化的解决方案,一般一个游戏studio的程序人数是最少的,但是工资也是最高的(平均),也基本不可能外包,裁员的时候一般最后才动程序组:p&br&&br&和it其它领域比起来,由于涉猎知识很广,要求很高,人才难找,所以算是软件开发中比较难的一块,特别是3A的游戏开发。
从我自己3A开发程序的经验来简单回答一下这个问题,本人有幸在微软343 industries参与了引擎和管线的制作(光环5),也有幸在索尼santa monica studio参与了gameplay的制作(新战神),算是参加过游戏开发的几个主要领域了,实际上游戏开发程序的工作主要分…
&figure&&img src=&https://pic3.zhimg.com/v2-2a3d34dee07e12d85eda_b.jpg& data-rawwidth=&960& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic3.zhimg.com/v2-2a3d34dee07e12d85eda_r.jpg&&&/figure&&p&GTA5的渲染优化向来为人称道。这篇文章是基于&/p&&a href=&http://link.zhihu.com/?target=http%3A//www.adriancourreges.com/blog//gta-v-graphics-study/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-60e35f537abac2bccdeaf9ff_180x120.jpg& data-image-width=&420& data-image-height=&236& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GTA V - Graphics Study&/a&&p&所写的对渲染过程的图形学分析,并大量引用了里面的内容。之前也有前辈做了翻译,这里我介绍了更多的细节与优化。读者需要一定的图形学基础去理解其中的概念,而我也在其中加入了一些自己的理解,若有错误希望不吝指正。&/p&&h2&&b&剖析GTA5(侠盗猎车手5)中一帧的渲染流程&/b&&/h2&&p&开始之前首先要指出,GTA5里许多渲染所用的缓冲都是&b&HDR缓冲&/b&(每个channel大于8位,无法在显示器上正常显示),直到每帧结尾才转化为常见的RGB图像。原作者&i&Adrian Courrèges&/i&为了演示方便,已经将这些HDR缓冲都转化为8位的正常图像。所以下文你看到的图片都是经过HDR处理过的。文末附上了原作者使用的HDR处理方式的简介以供参考。&/p&&p&&br&&/p&&p&好了,下面进入正题,开始详细的渲染流程介绍!&/p&&hr&&h2&&b&Step 1. 生成环境贴图&/b&&/h2&&p&每一帧开始时,GTA5首先渲染出一张&b&环境立方体贴图&/b&(Cubemap)。这张Cubemap用于后面计算池塘,河流等物体的反射,并不需要很高的精度, 只有地形,天空,摩天大楼等大型景致的低精度模型被渲染到Cubemap中,并且每一面的贴图大小只有128*128,只要约30个&b&draw call&/b&(绘图指令)即可完成。由下图可以发现,只有那些大型模型在水面里有倒影,无论行人、载具还是装饰的静态物体都是没有倒影的,这就是提高渲染效率的代价。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b1bf5a8ec434e3c6585f57fdaf523a50_b.jpg& data-size=&normal& data-rawwidth=&482& data-rawheight=&339& class=&origin_image zh-lightbox-thumb& width=&482& data-original=&https://pic1.zhimg.com/v2-b1bf5a8ec434e3c6585f57fdaf523a50_r.jpg&&&figcaption&人物,围栏,树木都是没有倒影的&/figcaption&&/figure&&p&&b&环境立方体贴图(Cubemap)&/b&:一个由6张纹理组成各个面的立方体,渲染方式为将摄像机置于你所在的位置,朝着6个方向各进行一次渲染(每次将摄像头角度旋转90°)。Cubemap也可以用于实现简单的天空盒,使远景一直与人物保持相对静止,实现天空的效果。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-89dc271d7ceeabe1a21f_b.jpg& data-size=&normal& data-rawwidth=&205& data-rawheight=&205& class=&content_image& width=&205&&&figcaption&环境立方体贴图(引用自Adrian)&/figcaption&&/figure&&p&然而GTA5在这里还加上了一个优化:将立方体贴图(Cubemap,6个面,128*128)转化为双抛物面贴图(Dual-Paraboloid Map,2个面,128*128),转化后的结果如下所示:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-4d7a0b1bd6d5f3d9eafd_b.jpg& data-size=&normal& data-rawwidth=&256& data-rawheight=&128& class=&content_image& width=&256&&&figcaption&GTA5使用的Dual-Paraboloid Map(引用自Adrian)&/figcaption&&/figure&&p&这两张图可以看成把原来的立方体贴图压缩成球体,然后映射到上半球和下半球上。这样做有什么好处呢?首先,它降低了显存开销(从6张到2张);其次,Cubemap是用于后续的反射计算的,考虑到多数情况中反射体正面朝上(水池,车窗等),只有那些高处的景物会被反射进我们眼中,所以大部分都是对上半球的贴图(上图右边部分)进行采样;再次,使用立方体贴图的话,我们在使用mipmap技术采样贴图时很容易在不同的面之间产生seams,而使用双抛物面贴图则会减轻这个问题的影响。&/p&&p&至此,用于后面计算反射的贴图已经生成好了。&/p&&hr&&h2&&b&Step 2. 背面剔除和LOD技术&/b&&/h2&&p&这一步的操作都由计算着色器(Compute Shader,CS)完成。原文没有提及很多细节,我稍作一些补充。&/p&&p&剔除(Culling)是一种很常见的优化技术,旨在提前去掉不需要渲染的面,比如背面消隐,视锥体剔除等。何为&b&&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Back-face_culling& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&背面消隐&/a&&/b&?比如将镜头对准一张纸板,只有纸板的正面需要渲染,背面则不需要(因为你也看不到背面的内容),这样可以减轻渲染的压力。一般都是通过传入的网格面片的顶点顺序来定义哪一面是正面。何为&b&&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Viewing_frustum& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&视锥体裁剪&/a&&/b&?摄像头同我们眼睛一样,能看到的通常都在一个平截头体中(太近、太远或太偏的物体都看不到),所以我们只要渲染在平截头体内的物体。&/p&&p&LOD技术(Level of Detail)则是为了处理模型的精度问题,精度越高的话,模型的表现越精细。但对于离摄像机很远的物体,用高精度模型渲染没有明显的画质提升,反而会消耗大量的显存(因为远处往往包含更多的物体,使用高精度模型的话,需要的模型面片数量将十分巨大)。常用的解决方案是 对同一个物体预先生成不同精度的网格,当物体离摄像机近时就用高精度的网格,离的远就用低精度的网格(后面介绍的Cascaded Shadow Map技术也是基于类似的原理,来保证近处的阴影质量更高),这样能尽量保证玩家感受高质量的模型。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e8c6ae79e48d79f6eb7d1c3a_b.jpg& data-size=&normal& data-rawwidth=&437& data-rawheight=&256& class=&origin_image zh-lightbox-thumb& width=&437& data-original=&https://pic4.zhimg.com/v2-e8c6ae79e48d79f6eb7d1c3a_r.jpg&&&figcaption&LOD:根据距离选择不同的模型精度&/figcaption&&/figure&&p&可以观察GTA5对于植被运用的LOD技术处理,当植被与摄像机超过一定距离后不再渲染就不再渲染,即模型精度为0。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-0bdbfc3458edd0f081234_b.jpg& data-size=&normal& data-rawwidth=&741& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic1.zhimg.com/v2-0bdbfc3458edd0f081234_r.jpg&&&figcaption&用人物手机拍照,拉近镜头时更多植被被渲染&/figcaption&&/figure&&p&GTA5对LOD技术的运用十分高超。我们知道GTA5的场景庞大而复杂,每一帧都需要对大模型进行处理,但它却能在显存只有256MB的PS3上渲染很多大型场景,并且将细节表现得十分逼真,足见它在LOD上下了很大的功夫。&/p&&hr&&h2&&b&Step 3. G-Buffer Generation&/b&&/h2&&p&主要的渲染过程就是在这一步进行,因此该步骤将做重点介绍。GTA5运用了&b&延迟渲染&/b&技术(与之相对的是:之前绘制cubemap时运用的是&b&前向渲染&/b&),利用MRT技术将同时渲染到5张渲染对象(贴图)。这里首先对名词稍作解释。&/p&&p&&b&前向渲染(Forward Rendering):&/b&在每一帧中轮流渲染各个物体,渲染每个物体时调用它的顶点着色器(VS)和像素着色器(PS),在PS中结合光源信息利用光照模型进行计算,将物体最终绘制在纹理上。该渲染方式存在一些不足:&b&首先&/b&,如果很多物体在摄像机方向前后重叠,则很可能同一个像素有多个物体调用各自的PS进行光照计算(最终只保留一个),这就造成PS运算的浪费,即over-drawing问题(采用由近及远的渲染方式可以减轻这个问题);&b&其次&/b&,当场景中具有大量光源时(如下图所示),每个物体需要向PS传入所有临近光源的信息并一一计算光照,考虑到庞大的物体数目和光源数量,这将严重影响PS的效率,形成GPU Bound。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b5e0d9a39d4b8b9462f36e_b.jpg& data-size=&normal& data-rawwidth=&960& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic3.zhimg.com/v2-b5e0d9a39d4b8b9462f36e_r.jpg&&&figcaption&GTA5夜间场景存在数以百计的光源和大量的物体&/figcaption&&/figure&&p&综合前面所说,前向渲染存在重要的运算浪费:一个像素可能被渲染了数百次(每次都会进行光照运算)但最终只有深度最低的那次运算结果得以保留,其他光照计算都被浪费掉了。&/p&&p&&b&延迟渲染(Deferred Rendering):&/b&针对前向渲染的缺点,延迟渲染换了一种思路。它利用MRT(multiple rendering target)技术将每个物体的漫反射、法线、镜面反射等信息分开绘制到4~5张主要的纹理(也就是G-Buffer)上,暂不进行光照运算。当所有物体的信息绘制完成,光源 再利用G-Buffers中的数据进行运算(”延迟“的由来)。 由此可见,场景的复杂度对光照计算量的影响大大降低(因为无论一个像素点被物体覆盖多少次,光源只对该点渲染了一次),大量光源的渲染得以实现。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-80e4fa9a50a77e9c267b8bed773b7491_b.jpg& data-size=&normal& data-rawwidth=&795& data-rawheight=&257& class=&origin_image zh-lightbox-thumb& width=&795& data-original=&https://pic2.zhimg.com/v2-80e4fa9a50a77e9c267b8bed773b7491_r.jpg&&&figcaption&GTA5延迟渲染示意图&/figcaption&&/figure&&p&下面将主要介绍一下G-Buffer里面几张贴图的具体内容(需要另外指出,这里所用的缓冲都是LDR而非HDR)。一张贴图有RGBA这四个8位通道,而像深度等信息只占一个通道,颜色也只占三个通道,如果只存一种信息必然会浪费空间,因此GTA5会将不同的信息合同到同一个贴图内以充分利用所有通道)。&/p&&ol&&li&&b&Diffuse Map&/b&:漫反射贴图,保存物体的原本的颜色。但与其他游戏不同在于,GTA5在这里顺便加入了阳光对物体的光照计算。考虑太阳的平行光特性,所有物体都会被照射到,这点代价(相较于在结合G-Buffer时进行阳光计算)还是可以接受的。下图中可以看出引擎盖上的对于阳光的光照计算。&/li&&/ol&&figure&&img src=&https://pic3.zhimg.com/v2-ed2a006e75adb91c286ab2_b.jpg& data-size=&normal& data-rawwidth=&431& data-rawheight=&244& class=&origin_image zh-lightbox-thumb& width=&431& data-original=&https://pic3.zhimg.com/v2-ed2a006e75adb91c286ab2_r.jpg&&&figcaption&引擎盖上的阳光光照计算(引用自Adrian)&/figcaption&&/figure&&p&剩下的alpha通道用于保存”Blending“(混合)信息,标志出需要抖动平滑处理的像素点。我们将在介绍Dither Smoothing的时候介绍它是如何使用的。&/p&&p&&b&2. Normal Map&/b&:&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Normal_mapping& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&法线贴图&/a&,用于存储每个像素点的法线,可以在光照计算时模拟表面的变化,从而提高真实度。&/p&&p&这里做一个比较:&b&延迟渲染&/b&中法线贴图存储的是每一点的法线在世界空间(World Space)的向量坐标,而&b&前向渲染&/b&为了方便在PS中计算光照,一般存储的是每一点法线在自己的切线空间(Tangent Space)的向量坐标。这就解释了前向渲染的法线贴图为何偏蓝色:贴图中每个通道只能存储正数,因此需要将法线向量的每一位从 &img src=&http://www.zhihu.com/equation?tex=%28-1%2C+1%29& alt=&(-1, 1)& eeimg=&1&& 线性映射到 &img src=&http://www.zhihu.com/equation?tex=%280%2C+1%29& alt=&(0, 1)& eeimg=&1&& 中,切线空间中常见法线向量 &img src=&http://www.zhihu.com/equation?tex=%280%2C+0%2C+1%29& alt=&(0, 0, 1)& eeimg=&1&& 将会被映射到 &img src=&http://www.zhihu.com/equation?tex=%280.5%2C+0.5%2C+1%29& alt=&(0.5, 0.5, 1)& eeimg=&1&& ,正好对应蓝色。&/p&&p&GTA5中使用延迟渲染,因此normal map需要存储法线的世界空间坐标,可以看出其色调与前向渲染的法线贴图不太一样。但主要色调仍为蓝色,因为大部分物体都是表面朝上(如地面),法向量的世界空间坐标仍会从&img src=&http://www.zhihu.com/equation?tex=%280%2C+0%2C+1%29& alt=&(0, 0, 1)& eeimg=&1&& 映射到 &img src=&http://www.zhihu.com/equation?tex=%280.5%2C+0.5%2C+1%29& alt=&(0.5, 0.5, 1)& eeimg=&1&&。&/p&&p&注意:这里要注意两张贴图的来源区别:延迟渲染的法线贴图是G-Buffer的中间产物;
而前向渲染中的法线贴图则是预先提供的美术素材。这里比较是为了更清晰地展示两张贴图的取值空间的不同。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-966189cfdf8a4cadbe5ce_b.jpg& data-size=&normal& data-rawwidth=&720& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/v2-966189cfdf8a4cadbe5ce_r.jpg&&&figcaption&GTA5(延迟渲染)的法线贴图 切线空间下的法线贴图&/figcaption&&/figure&&p&法线贴图的alpha可能是用于判断植被与摄像机的距离(决定是否渲染),原文不甚详细。&/p&&p&&b&3. Specular Map&/b&:&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Specularity& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&高光贴图&/a&,但这里并不直接存储每个像素的镜面反射光颜色,而是存储每个像素点最上面的物体的材质信息以供后续计算,原因在于:GTA5采用的延迟渲染,所以得在G buffer渲染结束后才会进行光照计算(否则光源很多时,你需要对一个物体进行上百次镜面光计算)。这里各个通道存储的信息为:&/p&&p&Red:高光强度(specular intensity)&/p&&p&Green:光泽度(glossiness)&/p&&p&Blue:菲涅尔系数(Fresnel Intensity,同一材质所渲染的像素点都采用相同的菲涅尔系数)&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a76addc83bea_b.jpg& data-size=&normal& data-rawwidth=&431& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&431& data-original=&https://pic3.zhimg.com/v2-a76addc83bea_r.jpg&&&figcaption&高光贴图并非直接存储高光颜色(引用自Adrian)&/figcaption&&/figure&&p&&b&4. Irradiance Map&/b&:辐照贴图(这个我不是很了解),主要用于保存每个点的辐照度。各个通道存储的信息为:&/p&&p&Red:每个像素点接收到的来自太阳的辐照度(基于该像素的位置,法线与阳光角度进行计算)。&/p&&p&Green:原作者猜测该通道记录了来自另一个光源的辐照度&/p&&p&Blue:记录物体的自发光属性(emissive),对于霓虹灯等物体占据的像素,该通道值非0。&/p&&p&Alpha:该通道主要用于标记皮肤、植被等需要特殊处理的像素点(后续将介绍如何处理)。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3c618f95a6fe65bee0ca_b.jpg& data-size=&normal& data-rawwidth=&450& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&https://pic3.zhimg.com/v2-3c618f95a6fe65bee0ca_r.jpg&&&figcaption&辐照贴图(引用自Adrian)&/figcaption&&/figure&&p&由上面容易看出,在白天时,Red通道基本都被填充,Blue和Alpha通道大部分为0。所以该贴图明显偏红。城市部分对应的绿色可能是做了特殊处理(我猜测是考虑了热岛效应?)&/p&&p&&b&5. Depth & Stencil Map&/b&:&a href=&http://link.zhihu.com/?target=https%3A//open.gl/depthstencils& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度贴图和模板贴图&/a&,用于存储每个像素点的深度和模板值。存储深度时GTA5做了一个优化:存储对数深度缓冲。公式为: &img src=&http://www.zhihu.com/equation?tex=d%3D%5Cfrac%7Blog%28C%2Aw%2B1%29%7D%7Blog%28C%2Afar%2B1%29%7D%2Aw& alt=&d=\frac{log(C*w+1)}{log(C*far+1)}*w& eeimg=&1&& , &img src=&http://www.zhihu.com/equation?tex=C& alt=&C& eeimg=&1&& 通常取小于1的常数, &img src=&http://www.zhihu.com/equation?tex=w& alt=&w& eeimg=&1&& 是观察空间下的深度, &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&& 是实际被写入缓冲的深度。&/p&&p&&b&为什么要做这个优化?&/b&正常情况下写入的深度与实际深度的关系为 &img src=&http://www.zhihu.com/equation?tex=d%3Da%5Cfrac%7B1%7D%7Bz%7D%2Bb& alt=&d=a\frac{1}{z}+b& eeimg=&1&& ,可以看出在近平面时 &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&&
的精度可以对应大部分深度;而当 &img src=&http://www.zhihu.com/equation?tex=z& alt=&z& eeimg=&1&& 很远时,需要距离较大改变,才能被 &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&& 感受到(因为 &img src=&http://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&& 的精度是有限的),因此在远处相近的两个物体深度会重叠,这就是Z Fighting现象。GTA5由于地图庞大,经常出现far plane很远的情况,因此必须要解决这一问题。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9ce450ecdc_b.jpg& data-size=&small& data-rawwidth=&830& data-rawheight=&430& class=&origin_image zh-lightbox-thumb& width=&830& data-original=&https://pic1.zhimg.com/v2-9ce450ecdc_r.jpg&&&figcaption&1/z中远平面的变化无法准确反馈给d(图片来自NVIDIA)&/figcaption&&/figure&&p&我们可以在存储d时使用一个&a href=&http://link.zhihu.com/?target=https%3A//developer.nvidia.com/content/depth-precision-visualized& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&拟对数分布&/a&来保证far部分能对应到大量的d值,near部分也能获得足够的精度,实际上正好可以用对数去模拟这样的分布,这就是公式的由来。我利用Mathematics简单绘制了对数缓冲公式的图像,并举例进行计算:下图右边可见,当far plane为 &img src=&http://www.zhihu.com/equation?tex=10%5E%7B7%7Dm& alt=&10^{7}m& eeimg=&1&& 时,假设物体从 &img src=&http://www.zhihu.com/equation?tex=10%5E%7B5%7Dm& alt=&10^{5}m& eeimg=&1&& 移动到 &img src=&http://www.zhihu.com/equation?tex=10%5E%7B5%7D%2B10m& alt=&10^{5}+10m& eeimg=&1&& ,对数缓冲的变化仍在精度范围内,而倒数函数的变化十分小,已经无法在24位精度下被计算机准确反应了。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-278a4b2dd3a589f55bfa4_b.jpg& data-size=&normal& data-rawwidth=&761& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&761& data-original=&https://pic1.zhimg.com/v2-278a4b2dd3a589f55bfa4_r.jpg&&&figcaption&对数缓冲函数能更精确地记录远处物体的深度数据&/figcaption&&/figure&&p&模板值被用来标志每个像素点渲染的网格类型,同一种网格所渲染的像素都用同一个值进行标志。之所以需要标志出来,是因为GTA5将对一些网格做后续处理(如皮肤,载具等),读取模板值可以决定应该用哪种方式进行处理。一些典型的模板值如下:&/p&&ul&&li&0x89:玩家所控制的人物&/li&&li&0x82:玩家驾驶的载具&/li&&li&0x01:游戏中的NPC&/li&&li&0x07:天空&/li&&/ul&&p&&br&&/p&&p&至此,G buffer中所有的buffer都被介绍完了,这些buffer一共调用了约1900个draw call。但是注意该part还没有结束,下面将列出一些渲染G-Buffer的其他细节;在这些操作完成之后,才能进行G-Buffer的合并计算。&/p&&p&&b&I. &/b&场景中物体都是”从前往后“渲染的,这样做的好处在于:像素被近处的物体先渲染了,后面的物体渲染这些像素时就无法通过深度测试,在调用PS渲染之前就被GPU丢弃了,从而提高了渲染效率。“从前往后”渲染能节省大量不必要的PS运算开销。从下图可以看出,人和车会占据屏幕的一大部分,而后面的物体则省去了渲染的开销。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a679b25a3f69fd66bb4a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&960& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic3.zhimg.com/v2-a679b25a3f69fd66bb4a_r.jpg&&&/figure&&p&&b&II. &/b&前面介绍diffuse map时提到diffuse map的alpha通道,被用来标志出需要抖动平滑处理的像素点。如果你将diffuse map放大查看,会发现远处的树占据的像素只有一半被渲染,就像国际象棋的棋盘一样。GTA5这样做并非因为渲染效率的限制,而是有意为之(在像素着色器中读取屏幕坐标判断是否渲染)。&/p&&p&这种抖动的渲染方式可以使得物体在不同的LOD之间的转化更为自然。在原文后面的Dither Smoothing介绍了后续操作:利用一个后处理像素着色器,读取alpha通道来确定被抖动处理的像素(远处的树木),然后对周围进行采样混合,计算出该像素点平滑处理后的颜色值。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-81b6bf39129eecd1f5a31_b.jpg& data-size=&normal& data-rawwidth=&899& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&899& data-original=&https://pic2.zhimg.com/v2-81b6bf39129eecd1f5a31_r.jpg&&&figcaption&处理前后图像对比(图像经过放大,引用自Adrian)&/figcaption&&/figure&&p&这里有一篇关于该技术(Alpha Stippling)的&a href=&http://link.zhihu.com/?target=https%3A//gamedev.stackexchange.com/questions/47844/why-are-some-games-using-some-dithering-pattern-instead-of-traditional-alpha-for& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&问答&/a&。GTA4也使用了该技术。&/p&&p&&b&III. &/b&阴影技术:GTA5采用了级联式阴影贴图(CSM,Cascaded Shadow Map),这也是大型游戏中常用的技术。对于普通的shadow map,很容易出现摄像机近处多个点对应到同一深度的情况,为了解决这一问题,通常会根据距离生成不同精度的shadow map,来保证近处的阴影的准确性。可以看到左图中大块区域会在shadow map中对应到同一深度,而右图中则可以保证近处的深度划分更加细致。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a4efff902cdca3d2bb0a34997daa753e_b.jpg& data-size=&normal& data-rawwidth=&742& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&742& data-original=&https://pic3.zhimg.com/v2-a4efff902cdca3d2bb0a34997daa753e_r.jpg&&&figcaption&基本的阴影贴图和级联式阴影贴图&/figcaption&&/figure&&p&GTA5将4张阴影贴图合成了一张的贴图,每个阴影贴图都对应了不同的视锥体(从光源出发)。注意到阴影贴图是从太阳发射的平行光的角度进行渲染的,结合下图和Diffuse Map可以看出,从左到右视锥体覆盖的范围越来越大,并且离摄像机越来越远(即不同距离生成不同精度的贴图)。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-27daa7a4fa33e31787a0cdd_b.jpg& data-size=&normal& data-rawwidth=&923& data-rawheight=&232& class=&origin_image zh-lightbox-thumb& width=&923& data-original=&https://pic2.zhimg.com/v2-27daa7a4fa33e31787a0cdd_r.jpg&&&figcaption&GTA5中的阴影贴图(引用自Adrian)&/figcaption&&/figure&&p&渲染这几张贴图可能会带来很大的开销,因此同一场景被渲染了四次。但值得庆幸的是渲染每张贴图时都可以用视锥裁剪裁去大部分不需要的物体,因此CSM只需要约1000个draw call就可以生成。最后太阳光和云投射的阴影经过平滑处理后进行模糊混合,存储到Specular Map的alpha通道内。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d2aaf7eaef8_b.jpg& data-size=&small& data-rawwidth=&903& data-rawheight=&508& class=&origin_image zh-lightbox-thumb& width=&903& data-original=&https://pic1.zhimg.com/v2-d2aaf7eaef8_r.jpg&&&figcaption&混合后的阴影贴图(引用自Adrian)&/figcaption&&/figure&&p&由于模糊操作需要从多个纹理中采样进行计算,代价十分高昂。GTA5在模糊混合之前还进行了一个优化:它首先生成原贴图1/8大小的贴图并进行低质量的近似模糊处理,通过结果估计出哪些像素点将会被完全点亮;然后对原大小的贴图进行高质量模糊处理时,如果该点被估计为完全点亮,则跳过模糊计算直接输出1(完全点亮的情况)。由上图可以看出,白天场景中大部分像素都会被完全点亮,因此这个优化可以节省大量昂贵的模糊计算。&/p&&p&&b&IV.&/b& SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽):在渲染场景时,墙角等地方往往会由于周围建筑的遮挡而显得比较暗。这是因为光线在角落里有更小的概率反射出去,因此墙角的光更难射入人眼中。用Path Tracing可以较好地去感受光线的传播路径,这里放一张我写的路径追踪的渲染结果(噪点太多,请忽视。。):&/p&&figure&&img src=&https://pic3.zhimg.com/v2-bdb7bbe9ea3a93b309692a_b.jpg& data-size=&normal& data-rawwidth=&454& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&454& data-original=&https://pic3.zhimg.com/v2-bdb7bbe9ea3a93b309692a_r.jpg&&&figcaption&Path Tracing的生成结果&/figcaption&&/figure&&p&可以明显看出墙角和墙沿的光线更加昏暗。而只计算太阳光是无法模拟出这样的效果的,因此提出了SSAO技术。考虑到G-Buffer中已经存有Normal Map, Depth Map等信息,我们可以在每个像素点对其法线方向的上半球进行采样,然后根据深度贴图确定周围有多少部分是高于当前深度,即确定有多少光会被遮蔽。计算结果会生成一张SSAO贴图,然而这个贴图一般噪音很强,因此还需要两个pass去做水平和竖直方向的平滑,更新SSAO贴图。&/p&&p&另外需要注意:为了提高效率,SSAO Map都是以原图一半的分辨率去实现的。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-b8fe6e8fe1a06_b.jpg& data-size=&normal& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/v2-b8fe6e8fe1a06_r.jpg&&&figcaption&未平滑的SSAO Map噪音十分严重(引用自Adrian)&/figcaption&&/figure&&p&&br&&/p&&p&细节介绍完了,终于是时候把这些G-Buffer的信息合并计算了!&/p&&p&一个像素着色器将从这些缓冲收集信息并最终计算出HDR下的渲染结果。对于夜间场景则会在这里额外渲染那些灯光,不做赘述。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bd4d5396bcc07ffa1f097b5f53a2e5bd_b.jpg& data-size=&normal& data-rawwidth=&941& data-rawheight=&287& class=&origin_image zh-lightbox-thumb& width=&941& data-original=&https://pic2.zhimg.com/v2-bd4d5396bcc07ffa1f097b5f53a2e5bd_r.jpg&&&figcaption&G-Buffer集合(引用自Adrian)&/figcaption&&/figure&&p&这是合并后的结果:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bb240f1daaa038_b.jpg& data-size=&normal& data-rawwidth=&922& data-rawheight=&518& class=&origin_image zh-lightbox-thumb& width=&922& data-original=&https://pic1.zhimg.com/v2-bb240f1daaa038_r.jpg&&&figcaption&G-Buffer Combination(引用自Adrian)&/figcaption&&/figure&&p&至此,渲染结果已经大致成型!&/p&&p&&br&&/p&&p&这篇文章大概介绍了原文四分之一的内容,由于中间加入了很多自己的理解,因此篇幅增长了不少,工作量也比较重。当然如果大家很感兴趣的话,我会继续翻译原文后面的内容。&/p&&p&&br&&/p&&p&&br&&/p&&p&此处附上HDR处理简介,感兴趣的读者可以了解一二:&/p&&p&这里简单介绍一下Adrian使用的HDR处理方式(详情参考Reinhard&i&的&/i&论文&i&Photographic Tone Reproduction for Digital Images&/i&):&/p&&ol&&li&对于每个像素点都根据RGB值计算出其亮度(符号为L,L=0.27R+0.67G+0.06B),然后利用以下方程更新该点的 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& :&img src=&http://www.zhihu.com/equation?tex=L_%7Bd%7D%28x%2C+y%29%3D%5Cfrac%7BL%28x%2Cy%29%281%2B%5Cfrac%7BL%28x%2C+y%29%7D%7BL_%7Bwhite%7D%5E%7B2%7D%7D%29%7D%7B1%2BL%28x%2C+y%29%7D& alt=&L_{d}(x, y)=\frac{L(x,y)(1+\frac{L(x, y)}{L_{white}^{2}})}{1+L(x, y)}& eeimg=&1&&&/li&&/ol&&p&&img src=&http://www.zhihu.com/equation?tex=L_%7Bwhite%7D& alt=&L_{white}& eeimg=&1&& 代表能映射到纯白色的最小亮度。这一步可以将 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& 全部映射到 &img src=&http://www.zhihu.com/equation?tex=%5B0%2C+1%5D& alt=&[0, 1]& eeimg=&1&& 区间内,但对于色彩范围极大的图片效果仍然不好,因此需要进一步处理。&/p&&p&2. 对于图片中的每个像素,找出适当的尺寸 &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 使得:以该点为中心, &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 为半径的区域与周围对比足够强(利用他定义的公式计算对比)。然后结合 &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 利用公式&/p&&p&&img src=&http://www.zhihu.com/equation?tex=L_%7Bd%7D%28x%2C+y%29%3D%5Cfrac%7BL%28x%2C+y%29%7D%7B1%2BV_%7B1%7D%28x%2C+y%2C+s_%7Bm%7D%28x%2C+y%29%29%7D& alt=&L_{d}(x, y)=\frac{L(x, y)}{1+V_{1}(x, y, s_{m}(x, y))}& eeimg=&1&&&/p&&p&重新计算 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& 。 这里&img src=&http://www.zhihu.com/equation?tex=V_%7B1%7D& alt=&V_{1}& eeimg=&1&& 是基于每个像素的 &img src=&http://www.zhihu.com/equation?tex=s& alt=&s& eeimg=&1&& 利用卷积计算出平均亮度。&/p&&p&然后按照色彩空间中的定义进行 &img src=&http://www.zhihu.com/equation?tex=L& alt=&L& eeimg=&1&& 与 &img src=&http://www.zhihu.com/equation?tex=RGB& alt=&RGB& eeimg=&1&& 的转化(这一块不太了解),即可得到处理后的图片,此时每个通道都可以用8位存储。处理结束。&/p&
GTA5的渲染优化向来为人称道。这篇文章是基于所写的对渲染过程的图形学分析,并大量引用了里面的内容。之前也有前辈做了翻译,这里我介绍了更多的细节与优化。读者需要一定的图形学基础去理解其中的概念,而我也在其中加入了一些自己…
游戏行业的渲染引擎程序在国内定位尴尬。&br&&br&做为渲染引擎程序,工作主要为:&br&&br&1. 为美术编写材质 shader,后处理 shader,特效 shader&br&2. 维护粒子特效系统,维护 gameplay 相关特效系统&br&3. GPU profiling,并编写相关 profiling 工具或者 profiling 模式&br&4. 修改、定制、二次开发渲染管线,包括渲染层及驱动层&br&5. 编写为上一点所服务的数据结构&br&6. 制定为上一点所服务的 production pipeline,及编写相关工具&br&7. 和美术沟通,和TA沟通,完善 production pipeline&br&&br&在国内大部分对于渲染程序的需求仅集中在1,2,3点。由于 unity 等工具的普及,前三点已经不需要专门的渲染程序去维护。而对于4,5,6,7点,大部分项目要么不敢做要么不想做。&br&&br&所以现状其实比较不乐观:一方面国内的需求不大,很难找到适合的团队或者项目;另一方面随着育碧上海等公司逐渐转向手游页游开发,国内在人才孵化上基本断档,在技术积累上和国外差距越来越大,并且没有任何扭转的趋势。&br&&br&所以个人建议毕业生从事这个方向的还是出国读书然后在国外生根发展,国内土壤不多,环境不好。&br&&br&===================&br&&br&另外点对点地回复一下题主的问题:&br&&br&1.只有自研引擎的公司才有这个职业?&br&大部分项目都有需要自己定制的画面需求,再简单也需要一些自己定制的特效什么的。所以如果仅是写 shader,那么大部分公司其实都是需要的。&br&&br&2.这个职业未来方向是什么呢?感觉离主程与技术总监都很远&br&国内的未来方向,除了去显卡厂当技术支持我并没有看出什么大的发展。国内基本没有渲染主程这种位置,技术总监很多是 general programmer 出身或者服务器出身。&br&&br&3.算是引擎程序员吗?需要学习引擎吗?&br&需要。不过这里指出学习引擎不是说把 UE4 会用了,那只是一个 UE4 美术外包人员的水平。需要学的是一些常用的架构,比如 UE4 是怎么实现多线程渲染的,基本的 deferred shading 是怎么做的,Gbuffer 是怎么分配的,tiled lighting 是怎么实现的,light map 烘培是怎么回事,shader 编译时怎么回事,等等。&br&&br&4.在学校需要掌握什么技术再去应聘?,c/c++,shader,GPU编程(多线程渲染?CUDA?)&br&面向对象的编程、基本的 shader、多线程。GPU compute 部分,游戏行业用 compute shader,不过懂 CUDA 的 compute shader 也就一天的事情。但是国内现状是很多项目连 DX11 的底层都没有。&br&&br&5.大公司与创业公司该职位的区别?&br&建议去已经有成功产品的小公司。说实话某厂现在图像渲染这方面是在开倒车。&br&&br&6.与逻辑程序员相比的优劣?竞争力怎么样?&br&在国内要竞争力强,那么多对 CPU 端优化、内存优化、文件读取等多放点心。在国外的话这个职位薪水是逻辑程序的1.5 - 3 倍以上。&br&&br&7.新人去是否打杂以及打杂的工作内容,是否能学到东西?&br&打杂不能学到东西,打杂的结果就是:1. 给别人的烂代码擦屁股;2. 年末考核让你背末位淘汰的锅。&br&&br&8.另外还有手游公司和主机公司的问题。。。。二者区别肯定铁大。。。。二者区别是什么呢?哪个更有意义?&br&国内还有主机公司么?如果仅仅是用商业引擎开发然后在 DEV KIT 上编译一把的话,那不算主机公司。另外从图像渲染的角度来看,手游的渲染和非手游的渲染,以后是两个工种。
游戏行业的渲染引擎程序在国内定位尴尬。 做为渲染引擎程序,工作主要为: 1. 为美术编写材质 shader,后处理 shader,特效 shader 2. 维护粒子特效系统,维护 gameplay 相关特效系统 3. GPU profiling,并编写相关 profiling 工具或者 profiling 模式 4. …
&p&支持一下楼上@刘思男 的答案。&/p&&p&不要做api搬运工~&/p&&p&想要学c#语言的话,就买一本c#语言的书来看。&/p&&p&想要学游戏开发的话,就去了解一些游戏引擎设计相关的书,或者游戏开发实现相关的书。&/p&&p&事实上Unity官网上有覆盖面很全的教程(网址如@刘思男的答案),国内也有Unity的evangelist在做一些官方的教程,这部分的话可以在&/p&&a href=&//link.zhihu.com/?target=http%3A//connect.unity.com& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-fd33405ef84ceaf31abbe_180x120.jpg& data-image-width=&1200& data-image-height=&630& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity Connect&/a&&p&上看到。而且这里还有一个官方的线上社区,方便交流。&/p&
支持一下楼上@刘思男 的答案。不要做api搬运工~想要学c#语言的话,就买一本c#语言的书来看。想要学游戏开发的话,就去了解一些游戏引擎设计相关的书,或者游戏开发实现相关的书。事实上Unity官网上有覆盖面很全的教程(网址如@刘思男的答案),国内也有Uni…
&p&不要看API,以topic为学习单位去学一个游戏引擎或者框架。&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//unity3d.com/cn/learn/tutorials& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity - Learn - Modules&/a&&/p&&a href=&//link.zhihu.com/?target=https%3A//unity3d.com/cn/learn/tutorials& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-3d7c84d71630eb0eafefb5471662caf0_180x120.jpg& data-image-width=&1200& data-image-height=&630& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity - Learn - Modules&/a&&p&上面是Unity官网的教程,他的组织内容的方式是就是以topic为单位。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-54b0c5b978f8fe36764f5ace49b77d96_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1291& data-rawheight=&1015& class=&origin_image zh-lightbox-thumb& width=&1291& data-original=&https://pic1.zhimg.com/50/v2-54b0c5b978f8fe36764f5ace49b77d96_r.jpg&&&/figure&&p&想学哪一个模块就去看看教程 再找找例程,注重去学习完成一个功能当中使用具体API解决问题的思路。&/p&&p&不需要直接盯着API去看,因为几乎所有高速发展的引擎或者框架 都会面临很快的API迭代,非常繁杂。必要的时候记下一些常用的API,一些很具体的API使用 在用得时候去查文档就好&/p&
不要看API,以topic为学习单位去学一个游戏引擎或者框架。上面是Unity官网的教程,他的组织内容的方式是就是以topic为单位。想学哪一个模块就去看看教程 再找找例程,注重去学习完成一个功能当中使用具体API…
记得05年刚读大学时看过一篇翻译的文章,《十年编程无师自通》&u&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/hkbyest/article/details/1322783& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/hkbyest/a&/span&&span class=&invisible&&rticle/details/1322783&/span&&span class=&ellipsis&&&/span&&/a&&/u&,当时虽然有些赞同,但更多还是觉得很不屑,想着自己大学有四年时间可以拼命学习编程,应该可以学出个名堂来吧。后面大二时开始专门学习游戏引擎相关的编程,想着就这么窄的一个领域,这几年应该可以学出个名堂来吧。一晃现在进入游戏行业工作也快十年了,回来头来看,对于游戏引擎,实时渲染这回事,也只不过感觉像在海边捡贝壳的小孩,才刚刚见到真正的知识大海而已,回过头来终于明白了什么叫《十年编程无师自通》,诚不我欺也。对于一个想自学的人,学习的路线图和学习的动力同样重要,否则很容易南缘北辙,虚掷流年。所以写这个Unity引擎渲染技术学习极简路线图,一是为了自我总结,二也是为了对同样想学习的人,有所助益。回想这十几年的蹉跎岁月,也自有其来处和去处。&/p&&p&
《程序员生存定律》这本书说“为了在成为高手这条路上走的顺畅,事实上有三个关键点:一是要有一张全局性的地图,以便选好方向;二是要知道都有那些坑,好绕开它,免得掉进去。三是要有足够的热情和动力,能坚持走下去。&&u&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/leezy_2000/article/details/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/leezy_200&/span&&span class=&invisible&&0/article/details/&/span&&span class=&ellipsis&&&/span&&/a&&/u&&/p&&p&&br&&/p&&p&一.初级&/p&&p&总体目标:掌握Unity4 现世代渲染技术理论与实践&/p&&p&理论必读:《Unity Shader入门精要》&/p&&p&理论选读:《3D数学基础:图形与游戏开发》&/p&&p&&br&&/p&&p&二.中级&/p&&p&总体目标:掌握Unity5 PBR前向渲染管线理论与实践&/p&&p&理论必读:《Real-Time Rendering, Third Edition》&/p&&p&理论选读:《光线跟踪算法技术》&/p&&p&
《微积分之屠龙宝刀倚天宝剑》&/p&&p&&br&&/p&&p&三.高级&/p&&p&总体目标:掌握Unity 2018 HDRenderLoop 次世代延迟渲染管线理论与实践&/p&&p&理论必读:《物理渲染 从理论到实现(第2版) 》&/p&&p&
《全局光照技术》作者:秦春林 &a href=&https://link.zhihu.com/?target=http%3A//thegibook.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&thegibook.com&/span&&span class=&invisible&&&/span&&/a&&/p&&p&理论选读:《实时阴影技术》&/p&&p&
《漫画傅里叶解析》&/p&
记得05年刚读大学时看过一篇翻译的文章,《十年编程无师自通》,当时虽然有些赞同,但更多还是觉得很不屑,想着自己大学有四年时间可以拼命学习编程,应该可以学出个名堂来吧。后面大二时开始专门学习游戏引擎相关的编程,想着就这么窄…
解释不解释也都是死掉了的技术了啊……&br&COM主要是一套给C/C++用的接口,当然为了微软的野心,它也被推广到了VB、Delphi以及其他一大堆奇奇怪怪的平台上。它主要为了使用dll发布基于interface的接口。我们知道dll的接口是为了C设计的,它导出的基本都是C的函数,从原理上来说,将dll加载到内存之后,会告诉你一组函数的地址,你自己call进去就可以调用相应的函数。&br&但是对于C++来说这个事情就头疼了,现在假设你有一个类,我们知道使用一个类的第一步是创建这个类:new MyClass()。这里直接就出问题了,new方法通过编译器计算MyClass的大小来分配相应的内存空间,但是如果库升级了,相应的类可能会增加新的成员,大小就变了,那么使用旧的定义分配出来的空间就不能在新的库当中使用。&br&要解决这问题,我们必须在dll当中导出一个CreateObject的方法,用来代替构造函数,然后返回一个接口。然而,接口的定义在不同版本当中也是有可能会变化的,为了兼容以前的版本同时也提供新功能,还需要让这个对象可以返回不同版本的接口。接口其实是一个只有纯虚函数的C++类,不过对它进行了一些改造来兼容C和其他一些编程语言。&br&在这样改造之后,出问题的还有析构过程~MyClass()或者说delete myClass,因为同一个对象可能返回了很多个接口,有些接口还在被使用,如果其中一个被人delete了,其他接口都会出错,所以又引入了引用计数,来让许多人可以共享同一个对象。&br&其实到此为止也并不算是很奇怪的技术,我们用C++有的时候也会使用Factory方法来代替构造函数实现某些特殊的多态,也会用引用计数等等。COM技术的奇怪地方在于微软实在是脑洞太大了,它们构造了一个操作系统级别的Factory,规定所有人的Interface都统一用UUID来标识,以后想要哪个Interface只要报出UUID来就行了。这样甚至连链接到特定的dll都省了。&br&&br&这就好比一个COM程序员,只要他在Windows平台上,调用别的库就只要首先翻一下魔导书,查到了一个用奇怪文字写的“Excel = {xxx-xxx-xxxx...}”的记号,然后它只要对着空中喊一声:“召唤,Excel!CoCreateInstance, {xxx-xxx-xxxx...}”&br&然后呼的从魔法阵里面窜出来了一个怪物,它长什么样我们完全看不清,因为这时候它的类型是IUnknow,这是脑洞奇大无比的微软为所有接口设计的一个基类。我们需要进一步要求它变成我们能控制的接口形态,于是我们再喊下一条指令:&br&“变身,Excel 2003形态!QueryInterface, {xxx-xxx-xxxx...}”&br&QueryInterface使用的是另一个UUID,用来表示不同版本的接口。于是怪物就变成了我们需要的Excel 2003接口,虽然我们不知道它实际上是2003还是2007还是更高版本。&br&等我们使唤完这只召唤兽,我们就会对它说“回去吧,召唤兽!Release!”但是它不一定听话,因为之前给它的命令也许还没有执行完,它会忠诚地等到执行完再回去,当然我们并不关心这些细节。&br&&br&微软大概会觉得自己设计出了软件史上最完美的二进制接口,从今以后所有的第三方库都可以涵盖在这套接口之下。然而历史的车轮是无情的,它碾过那些自以为是的人的速度总是会比想象的更快。Java的直接基于类的接口被广泛应用,开发使用起来远远来的简单,即便偶尔出点问题大家也都想办法解决了,事实证明程序员并不愿意花10倍的编写代码的时间来解决二进制库的版本兼容问题,他们更愿意假装没看见。很快微软也抄了一个.NET托管dll的方案出来,于是纯的二进制接口COM就慢慢被抛弃了。&br&&br&COM,OLE,ActiveX,OCX,VBScript,历史不会忘记你们的,如果历史忘了,我替历史记住你们。安息吧。&br&&br&=============================================================&br&&br&这怎么还火了,这不应该是一个讨论遗留技术的冷门问题吗……&br&&br&补充说明一下,其实并没有贬低COM的意思,COM在当时一定是一个伟大的发明,只是技术革新太快。到今天,其实COM都是C++的二进制本机代码的动态链接的最佳的选择(Windows上的)。但是,C++,二进制本机代码,动态链接,这三件事现在没有一件是重要的……&br&COM在Windows操作系统底层继续发挥余热的时间肯定还会很长,因为永远都会有偏底层的C++开发的需要,必须游戏之类。只是技术趋势已经很明确了。
解释不解释也都是死掉了的技术了啊…… COM主要是一套给C/C++用的接口,当然为了微软的野心,它也被推广到了VB、Delphi以及其他一大堆奇奇怪怪的平台上。它主要为了使用dll发布基于interface的接口。我们知道dll的接口是为了C设计的,它导出的基本都是C的函…
已有帐号?
无法登录?
社交帐号登录
14732 人关注
677 条内容
3801 人关注
1431 条内容
380 人关注
153 条内容
263 人关注
17019 人关注
4322 条内容}

我要回帖

更多关于 反汇编工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信