ChristerEricson著《实时碰撞检测算法技术》作品简介与读书感悟

翻译:赵菁菁(轩语轩缘)审校:李笑达(DDBC4747)在这篇文章中,我想描述一下在现代渲染系统中我所期望的特性和性能特点:它应该支持无状态渲染,支持在不同的层/桶中渲染,还可以在尽可能多的内核上并行

翻译:赵菁菁(轩语轩缘)审校:李笑达(DDBC4747)

在这篇文章中,我想描述一下在现代渲染系统中我所期望的特性和性能特点:它应该支持无状态渲染,支持在不同的层/桶中渲染,还可以在尽可能多的内核上并行运行渲染。

最近我一直在考虑如何有效地实现这样一个渲染系统,在我去实现整个系统之前,我希望能够记录/分享目前为止我的想法和发现。

渲染后端

我说的渲染后端是什么意思?在我看来,渲染后端应该只负责一件事:用图形API(如D3D或OGL)提交绘制调用。高级系统的责任是确保只进行最少量的绘制调用,并对命令调用和状态更改进行排序和优化。

无状态渲染

我们通常处理的所有图形API都是有状态的。这意味着每当你为后续的绘制调用改变API中的任何状态时,这种状态变化也会影响到稍后提交的绘制调用。比如说,如果你把一些对象的剔除状态从背面(backface)改成前面(frontface),你需要在对象渲染完成后重置状态,或为其他所有对象设置默认状态,否则的话,一些对象最终会按照错误的剔除状态渲染。

向用户公开这种有状态的API容易出错,而且抽象性较差。理想情况下,无论我们想要什么状态,提交一个绘制调用都不会影响到任何其他绘制调用。这样我们就可以把每一个独立的绘制调用当作一个单独的“事情”来处理,它携带所需要的所有状态,而不是把任何状态泄漏到其他的调用中。

这也将使我们能够轻松地更改绘制调用的顺序(只要渲染结果保持不变),这样我们就可以摆脱冗余的状态变化,并通过特定的键(前到后、后到前、或其他一些标准)对绘制调用进行排序。

关于Civilization V中使用的Firaxis的LORE系统的介绍更加详细。

分层渲染

也被称为桶分化(bucketized)渲染,主要想法是给绘制调用分配一个之后用于排序的键。通常情况下,该键是一个32位或64位的整数,没什么别的。通常,一个键编码了绘制调用个别位的某些数据,如距离、材质、着色器等。根据这些位存储在整数中的位置,只要你知道键是如何构建的,就可以对同一个绘制调用数组应用不同的排序标准。

这是一种非常有效和直接的方法,因为你可以在整数上使用简单的基数排序,而不必担心如何对数据进行排序(按距离排序吗?通过纹理?根据材料?)。排序标准基本上是在整数的位上编码的——如果你想按材料排序而不是按距离排序,只需把各自的位放在不同的位置上就好。

如果你不熟悉它的话,读一下埃里克松(ChristerEricson)的博客,里面很好地解释了这个概念。

我的观点是,我不想把每一层的每次绘制调用都塞进一个大小相同的键中、将它们全部存储在一个大的流中(或每个线程的本地流),而是为不同层使用大小不同的键。例如,当绘制阴影贴图时,对象应该由前向后排序,不需要按材质或着色器进行排序。因此,对于一个粗略的、基于到摄像机距离的、由前向后的排序,一个16位整数可能是足够的。因此,我会把那些16位键放在不同的“桶”中,而不是把它放在属于其他层的绘制调用中。

我可以为阴影贴图桶设置16位键,为透明物体桶设置32位键,为一般的G缓冲桶设置64位键。这里的想法是:更小的数据可以更快地排序,并且单个的桶可以在不同的线程上并行排序。

多线程渲染

ChristerEricson著《实时碰撞检测算法技术》作品简介与读书感悟

采用这种分层的/ 桶分化的系统,我们得到的最大好处之一——当然是利用所有可用线程渲染的能力。通常的方法是把整个帧的所有绘图调用入队到层/桶中,然后按键排序,再使用前面提到的渲染后端将它们提交给图形API。API调用只在主线程中完成,但是让单个调用进入队列可以很容易地并行完成。

如果引擎遵循面向数据的方法,并且/或使用任务调度器,每个内核可以一次处理N个给定的实体,可能将其工作分解成几个任务,这些任务被交给调度程序处理。不是把所有绘制调用及其键存储在一个数据流中,我可能会使用类似于Bitsquid使用的方法:在每个线程本地流中存储绘制调用数据,然后在主线程提交之前进行排序和合并。

总体思路

ChristerEricson著《实时碰撞检测算法技术》作品简介与读书感悟

更具体地说,不应该这样做:

for each (bucket b)

{

for each (entity e)

{

submit_draw_call_to_bucket(b,get_draw_call(e,b));

}

}

而你应该这样做:

for each (entity e)

{

submit_draw_call_to_bucket(shadow_map,e);

submit_draw_call_to_bucket(g_buffer,e);

...

}

ChristerEricson著《实时碰撞检测算法技术》作品简介与读书感悟

这可能看起来微不足道的一些吧,但我认为这是值得指出的。毕竟,还是有很多人通过遍历的矢量对象、为每个对象调用Render()方法来渲染GameObjects 的std::vector,调用每个对象的虚拟()方法。这样做没什么错,但你不能用这样的方法完成含有成百上千实体的游戏。

今天就到此为止。我希望下星期四有更多的东西可以分享,甚至还可以看一些代码!

【版权

上一篇 2023年05月16 00:36
下一篇 2022年12月30 11:11

相关推荐

  • 怎样注册苹果id账号

    苹果设备如何注册新的AppleID?关于AppleID日常使用的注意事项你是否知道?AppleID成功注册后,该账号是与自己登录的苹果设备的安全与隐私信息,息息相关。我们需要保证ID账号的使用安全。关

    2022年12月27 208
  • 三星堆是谁的墓,三星堆的恐怖传说

    本文刊于《巴蜀史志》2019年第1期三星堆的发现改写了中华文明史特别是古蜀历史,但对其形成和消失的研究还比较初浅,特别是对这些遗物为什么多有火烧和损毁的痕迹,更没有很好的解释。我们应用历史唯物主义思想

    2023年04月24 230
  • 苹果系统怎么截图,电脑苹果系统怎么截图

    案例:苹果手机怎么截屏?【朋友们,新入手一部苹果手机,想问下手机怎么截屏?感谢!】苹果手机是一款智能手机,其截屏功能可以帮助用户快速保存需要的信息或者瞬间记录有趣的瞬间。然而,电脑苹果系统怎么截图,很

    2023年05月16 226
  • 黑卡怎么办理,普通人能办黑卡吗

    黑卡是从国外流传进来的,正宗的黑卡是1999年由美国运通公司发行的“百夫长系列签账卡”,黑金卡是由钛合金锻造,卡面黑色,刷卡额度无限,还款期一个月,无分期待遇。百夫长黑金卡是世界公认的“卡片之王”,持

    2023年05月15 279
  • 怎么做好外卖,外卖如何

    众所周知,外卖小哥的工作是非常辛苦的,其待遇和酬劳自然也是比较高的。因此,网络上时不时的就会传出一些关于外卖小哥挣到高薪收入的新闻,连媒体也不时的会进行一番报道。一时间,大家觉得外卖小哥都是月入过万的

    2023年05月25 261
  • 怎么改群主,群员怎样把群主换掉

    14日深夜冲上热搜第一据“微信派”6月14日消息微信新增“群聊消息置顶”功能群主和群管理员长按一条消息在弹出菜单中选择“置顶”就能将消息固定到顶部群成员点击后会自动定位到消息所在位置方便查看完整上下文

    2023年06月01 250
  • 休息怎么说,在微信上和领导请假应该怎么发

    舔王做人的原则?上班和下到时候的你,口才都是怎么练出来的?上班和下班的你有什么不同?上班的时间谁发消息我都想跟他聊两句,下班时间谁发消息我都不想理。做人的原则。我这人主打的就是放下个人素质,享受缺的人

    2023年06月01 224
  • 申请qq号怎么申请,现在能不能申请QQ号

    今天(2月10日)“QQ崩了”登上微博热搜第一有网友反映QQ一直掉线进入QQ申请页面,点击进入新用户注册,输入手机号码点击勾选已阅读,点击下一步输入验证码,之后只需要输入昵称和设置密码,点击注册并登陆

    2023年05月24 295
  • 为什么大四女生是番茄,大一的女生是苹果为啥大四是番茄

    每天被各种段子轰炸。是不是觉得自己已经是老司机了?段子哥想说。之前你看到的段子都太小儿科了!段子哥为你准备了20个内涵段子。试试你能看懂几个?如果你连5个都看不懂。就不要号称自己是老司机了跟着段子哥长

    2023年04月12 237
  • 怎样搜索图片来源,在线识别图片找原图

    图片来源:图虫创意想做好搜索引擎优化(SEO)那么首先要清楚谷歌搜索引擎的工作原理。如果我们想要做独立站的SEO推广工作但连基本的原理都不知道,在线识别图片找原图,那么后面一系列的推广优化工作获得的结

    2022年12月30 288
  • 怎样拉黑qq好友,QQ如何彻底拉黑一个人

    昨天一大早,有不少网友发现,自己辛辛苦苦积累了好几年的QQ名片点赞数被清空,纷纷在微博等社交平台上发帖投诉,引发网友热议,并且迅速爬上了热搜榜。对此,@腾讯QQ也迅速在微博上回应:这是因为服务器升级导

    2022年12月29 243
  • 魅族主板维修多少钱,魅族手机主板坏了修要多少钱

    喜欢的小伙伴可以点一下右上角的关注!!!每天都有科技方面的资讯。今天魅族再次推出手机扩容的活动,这次活动新增了12款机型新增30家服务网点。这次的活动时间是7月3日--7月17日,为期两周的活动时间。

    2023年04月04 276
  • 怎样制作微信小程序,微信小程序合成小院怎么弄

    根据腾讯财报显示,微信小程序合成小院怎么弄,小程序日活页用户突破5亿,交易额保持着快速镇长,进一步融入到生活中。近几年面对着疫情的持续挑战,商家们以小程序、线上店铺、社区等数字化工具成为企业持续经营以

    2022年12月26 268
关注微信