失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 字节VR射击游戏开发日常实习一面日记

字节VR射击游戏开发日常实习一面日记

时间:2020-04-13 12:30:36

相关推荐

字节VR射击游戏开发日常实习一面日记

中间发生了很多事情,现在才静下心来写一下大致的过程。尽量描述一下我答的情况,虽然很糟糕就是了。

字节面试非常出乎意料,因为自己c++是主力语言,因此和hr说的时候说不用准备(其实也是因为时间挺紧的)。结果在面试时并没有涉及到相关的内容。

相反非常偏向于实际上的应用,比如人物描边的算法设计之类的交给你来进行设计。但不巧的是自己并没有很多的引擎实践,大部分情况下也都是在用引擎在写物理模拟、优化等过程而已。

面试大致回忆流程:

1、自我介绍。

2、介绍一下渲染管线

这里被打断了一下,因为我提到的第一个是顶点渲染器,但对方并不满意,因此我说了顶点的读入。当然这肯定还是不完整的,当时大概也知道。(当时那段跳过去看vertex shading了)

根据RTR4中的介绍,第一个阶段是Application应用阶段,这个阶段是CPU负责运行,或者是利用compute shader的并行化部分都在这里,一般负责物理模拟与剪裁。(某人做这个却“恰好”跳过了这部分)物理模拟就不用讲了,剪裁通常是想办法减少要渲染的三角形数量。

然后是通常的Geometry Processing,这部分就好说了,顶点,细分,剪裁,图元,片段。不过我说的是从GL上学的分类,RTR4中写的是:顶点,投影,可选项(图元,细分等),剪裁,屏幕投影。这里的剪裁和前面的差不多,但并不相同,这里是去除视野以外的部分,并在边界处用新增的点来替代(画家优化可以在这里做)。屏幕投影就是说把三维数据转换到屏幕空间。(主要说了这部分)

然后是光栅化,光栅化又分两步:Triangle setup与Triangle traversal(准备三角形和遍历三角形?不会翻译),Triangle setup负责处理三角形的各种计算*(具体的并不清楚,根据RTR4所说,负责差分,边值等式等内容)提供给traversal阶段使用,traversal阶段就是遍历三角形,MSAA,SSAA应当在这个阶段进行,将每个三角形/其他图元转换为像素表达并给出相应的深度,对结果进行相关优化。(走样与反走样)(这部分我回答的也并不细致)该部分基本是固定管线操作。

最后才是像素操作,这也是本次面试最大的失败之处,因为我混淆了像素操作与光栅化,导致后面的回答明显令面试官不满。在像素操作中,同样分为两个部分:Pixal shading与Merging。Pixal shading部分正是材质渲染所在的部分,负责计算每个像素的着色问题,也就是说Bling-phong也是在这里做的(注意高洛德是顶点着色)(之前做过纯cpp的,大学毕业前打算写一个纯cpp的完整的引擎,虽然这东西大家大二就都写过了...)Merging就是测试与混合阶段,在这里zbuffer进行了运行,接下来就是深度测试与alpha混合了。最后得到的就是我们看到的图片。

可能要注意的是GPU部分是从顶点着色到混合这部分,而现在说的compute shader之类的其实在这之前。然后是可编程问题,顶点、曲面、几何、剪裁(部分,主要是裁剪算法与数据结构)、Triangle setup&Traversal(部分,不是很了解),片元。测试混合与屏幕投影基本是完全的固定管线。

3、主要是介绍一下上面的内容,上面写的比较详细就不说了。主要是这些步骤都是怎么操作的,比如MVP矩阵,如何进行投影反应出空间感,如何进行深度测试。

4、给定一个物体与深度贴图,如何进行深度测试。(答得对方感觉不满意,我说了利用深度贴图修改实际深度然后做深度测试的方式)

5、在光栅化阶段,如何判断点在物体内。比较迷惑,因此我说了一个基于边的叉乘方法,对方不是很满意,感觉说的不是一个东西。

6、根据4,引出了如果引入一个可控制对象,如何判断对象在物体前还是物体后。zbuffer内容。

7、如果一个对象站在物体后面,然后做出类似csgo的人物描边效果。我没有很理解这部分,面试官给出了我两种方案,我不太确定是否理解了,这里给出我理解的大致思路:

利用贴图,回溯查找是否在模型中可见,如果一个点可见而相邻部分不可见,则为边界。

利用法线贴图,与视线向量做点乘,如果向量结果发生符号变化,则为边界。

面试官也提到并不那么精确,会产生一段的虚影。交流的过程中我反应过来了,其实就是个光照问题的改版。

8、给定一个人物对象,如何实现人物在死亡时的消融。我回答的调整alpha值,感觉答错了...面试官还是很沉默。对方表示这个值并不好调整。

9、快速移动小物体的碰撞检测,这部分比较熟悉,说的是用推断方式的CCD做的,可以进行投射(投影)推断落点,然后/或者进行AABB等拟合方式进行优化,最后使用更小步长的精细模型操作和在一定范围内出现错误后进行拉回。然后面试官问了我幽灵碰撞的相关问题,发现我看过Unity这部分,因此又询问了穿透问题如何解决,这里就断掉了,我以为是Unity中扫掠CCD无法击打小球的问题,结果好像不是在说这个,暂时还没找到是哪个问题。

10、询问项目中布料模拟部分如何做,对方不是很了解因此又问了我如何并行化,结果自己只做了CPU,GPU优化完全不是很了解,并行那里没给人家串上,还在学习...导致感觉对方评价不高。我说了一个mass-spring的高斯的方法。

11、两道算法题,非常简单。然后自己头脑过热题读错了写了个假的,还导致拖了半个小时...心态比较不平稳。面试官也很有耐心的在等我...惭愧。简单的程度大概就是我第一次学c的时候就会做的难度...不知道该说什么,面试经验可能还是浅薄。第二题是如何做一个类似祖玛的连续消除,然后我头脑一热写了个单步删除。笑死,结果最后反应过来后就写了两行代码,丢大人。

12、问我怎么学到这些东西的,比较实诚,就说自己感兴趣于是去找人接触到了games开始看课程,然后看到有兴趣的就去看看对应的论文或者科普,然后被追问如何产生兴趣,答的也比较简单:出新课程了(games103),老师要求做人工智能(nerf与softrasterizer),好奇有没有优化(扫掠CCD),感觉现有方式过于古老(zbuffer与softrasterizer),好看(光追与全局光照)。

13、最后谈论了一下工作中要做些什么内容,面试官提到业务中的东西会做的比较多而研究方面的会比较少,但是自己想到引擎应用这部分自己确实欠缺,因此也表示自己愿意做这方面的内容。然后是问了一下并行优化compute shader这部分的应用,对方表示应用其实很少,主要是并行化算法并不好遇到。

还问了自己需要在哪里进行更多的研究,对方推荐自己去看一下unity的URP/LMRP部分的内容,多熟悉一下引擎。(说起来之前也有被推荐看cocos)我觉得大学专精一两个引擎就不错。个人打算unity和ur混合着看。

实践的项目问了很多,如果不是现场面试的话这些问题自己想想可能觉得很简单,但一到面试其实是不太一样的。自己也是没有太多准备,自以为c++虽然不强,但写了这么多学了这么多其实学的还行,结果面试一个没问。图形学方面确实也有很多记忆不清的地方,导致对方可能觉得也不满意。

但现在可能还是日常实习有点比烂,导致面试官觉着我答的还行(惭愧),因此过了一面。第二天收到的二面通知,希望立刻进行面试,结果我在滑雪导致hr后面也被我破了防(大惭愧),还没过去工作就让三人破防的天才玩家...尽力准备周一的面试吧。

如果觉得《字节VR射击游戏开发日常实习一面日记》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。