tech2
每周总结#2
1. 毕设
目前为止还是不知道自己要做什么。
不过就算知道了,我估计也做不出来。python代码有个弊端就是,对于一个变量它的类型需要你无数次Ctrl+F来自行推导。对于pytorch这里面无数的张量,你要一个一个推出它的shape,然后来确保自己在某个函数的代码能够理解了。
当然我要写的话应该是写cuda代码,然后在python这里看看怎么调用cuda。唉,真头疼,感觉选了个最难的毕设。
我要做的是研究3DGS与光照结合的方法。之前在games101学的无论是光栅化还是光线追踪,都是基于mesh的模型,而3DGS是点云模型,因此需要研究方法能让点云模型具有光照特性。老师给的论文介绍了,在3DGS的基础上,增加一些诸如法向量,以及一些PBR材质相关的可训练的参数。然而我不是做AI的,不知道在代码层面上是怎么在cuda里实现反向传播的(只知道pytorch里的optimizer.step),结果要我改这部分cuda的代码,。。。
希望能水过去,搞的我现在有点烦。
2. 学习
games104
开始了games104的课程,这是个讲游戏引擎怎么构建的课。
目前听了前三节,感觉讲的太笼统了,我还是比较喜欢看代码。
稍微总结一下吧:
首先是引擎架构,其根据功能进行分层,有:
- 平台层:不同平台(比如操作系统,当然还有所谓的Graphics API,比如opengl,dx,vulkan,当然这些我也不是很懂)会提供不同的底层API,游戏引擎需要为开发者提供统一的API,这东西好像叫RHI。
- 核心层:一些数学运算、内存管理、数据结构的实现,比较底层
- 资源层:将不同类型的资源(resource)导入引擎成为对应的资产(asset),每个asset有对应的GUID方便管理,每个asset也有对应的生命周期,需要handle系统去管理
- 功能层:每一帧会调用tick函数,它大致执行两个任务:tick logic和tick render。当然也不止这两个任务,功能层是最多的内容,它可能还涉及到并行化。
- 工具层:编辑器那些,让开发者进行开发的空间。
然后是对于游戏世界的认识,它包括一些动态物、静态物、环境等等。对于基本的游戏世界的对象,用GO(Game Object)来表示。
每个GO有许多的组件(compoment,玩过Unity应该很熟悉这个),当然这样的组件化设计其实是有很多缺点的,但我没写过对应的代码,没什么认识。
其次就是tick,它是让游戏世界动起来的原因。一种tick方式是一个GO一个GO的tick,还有一种tick方式是按照组件类型进行tick,后者可能会更有效。(cache的空间局限性?)
其次就是交互,采用event事件机制,将不同对象的不同组件之间进行解耦合。
对于场景的管理,引擎的核心层(我猜的哈)可能会用一些数据结构进行高效管理,例如毕设接触到的bvh树来通过场景内的物体位置进行构建,加速查询流程。
对于tick,其实它的时序很有讲究。针对event的邮局机制则有效地解决了事件机制与并行化结合可能导致的时序问题。
总结完了,感觉啥都没总结到。慢慢学吧,我总是太急,想看代码。
tinyrenderer
之前说过,结束了games101的学习,大部分同学可能都会尝试地去写一个自己的软光栅。我也不例外,因此我开始了这个项目的学习。
目前呢?刚学会画直线???2333
misc
好消息,离开NUAA了,真的非常开心。
下一次就可以永别这里了,希望再也不用看见这里的人,再也想不起这里的事。
3. TODO
白天搞学校的毕设和其它事情(读论文?做实验?反正都是浪费时间的事情)
晚上学自己喜欢的东西。
没时间打acm了,认命吧,拿不了金牌的fw。