长文面经:零基础游戏渲染/图形引擎开发之路

目录

1    背景

1.1    春招

1.1.1    学习路线

1.1.2    原因分析

1.2    秋招

1.2.1    学习路线

1.2.2    记录表格

1.2.3    原因分析

1.3    其他

2    面经

2.1    C++

2.2    数据结构与算法

2.3    图形学3D数学

3    总结

背景:

本帖的主要内容是面经八股的分享,虽然有总览帖(https://www.nowcoder.com/discuss/793418)但第一部分还是先说一下整个春招秋招的背景情况:

本科非科班,研究生专业AI安全方向,对于游戏行业的了解和学习基本是从去年春招开始的。最终上岸的图形开发岗要学的东西在春招前一点都不会,编程只会python。属于是标准零基础。整个春、秋招的进度安排参考了一个网易图形开发前辈的帖子: https://www.nowcoder.com/discuss/555201(同司同岗,属于是亲传弟子了)

春招

学习路线:

3月:C++基础、Games101、刷题

4月:面试(处刑)、STL、刷题、Games101、Unity Shader入门精要

5月:Raytracing in one weekend

最后结果:全挂

原因分析:

1.图形学方面,101只是粗略学习、不够深入,

2.C++刷题数量不够、项目经验为0

3.岗位投递方向不明确,投了很多游戏研发岗位,而非图形开发、引擎开发。游研等岗位都更倾向于C++的考察而非图形学,没有C++项目和实战经验很难过关。

4.最根本的:学得太晚,很多知识点面试时是第一次听说或者听过但完全没想过。以面代学,战绩惨淡。

秋招

7月上旬,秋招开始(其他同学的实习也开始了),我(独自在学校)总结吸取了春招的教训,针对秋招做了以下两方面的调整。 一方面我重新确定了就业的方向:找以图形学而非C++为基础(面试重点)的岗位:技术美术TA、图形\渲染开发、引擎开发。具体选择见后面 另一方面我针对不同公司的不同岗位,做了多份简历,针对岗位要求,重写了简历。具体修改见后面

学习路线:

7月:Games101复习整理、Games202初步

8月:《Raytracing in one weekend》复习、《Raytracing the next week》、OpenGL入门、RTR3提炼总结

9月:开始集中笔试面试

秋招记录表格(包含各公司结果反馈的情况):

多益网络 技术美术TA 7.12投 8.2一面挂 无通知

游卡 技术岗 7.15笔试挂 无通知

竞技世界 引擎开发 7.16一面 7.20二面 8.30笔试 10月中旬OC 先面后笔

搜狐畅游 引擎开发 7.27一面挂 无通知

巨人网络 引擎开发 7.30笔试 8.16一面 8.23二面挂 有通

盛趣游戏 U3D开发 8.12笔试 9.13一面 9.23二面挂 无通知

祖龙娱乐 图形渲染开发 10.11一面挂 无通知

莉莉丝 引擎开发 9.6笔试挂 无通知

网易互娱 图形开发 8.28笔试 9.6一面 9月下旬二面 10.12意向

心动 引擎开发 8.28笔试 9.18第二次笔试挂 有通知,两次笔试

英雄游戏 U3D开发 9.9笔试挂

友塔游戏 技术美术 8.22笔试 8.24一面 8.27二面挂 有通知

哔哩哔哩 C++开发渲染方向 8.25笔试 8.31一面挂 有通知

哔哩哔哩 引擎开发(二志愿)9.13笔试 9.30一面 10.12HR面 10月下旬OC

4399 技术美术TA 8.28笔试 9.26意向 忘了有没有面试

完美世界 图形开发 9.7笔试 9.14一面挂 无通知

酷家乐 图形渲染开发 9.11一面 9.15二面 10月中旬OC

Garena 图形\引擎方向 9.16笔试 10.22一面 11.17二面 12.9通知挂 这个时间不愧是外企

网易雷火 技术策划TD 9.18笔试挂 我为什么要投TD

对比春招有所提高的原因分析:

1.时间充分:7月开始准备,而一面集中在8月下旬和9月上旬,基本有两个月时间。

2.方向正确:我对于图形学相关的岗位目标明确,不会再投游研等岗位,所以不需要准备多个项目。

3.备战策略:考虑到C++和图形学的侧重点,我在学习时重点学习了《Raytracing in one weekend》、《Raytracing the next week》以此来作为简历的核心项目。

4.以面代学:不同于春招时把面试当作ddl然后多次的突击学习,秋招时我把面试当作一场考试,在面试中寻找知识漏洞。比较典型的是,友塔二面对于3D数学(向量、矩阵等)的考察非常重,所以面后进行了恶补,然后在哔哩哔哩一面得到显著提高,但是又在这次面试中发现了编程大漏洞(k个一组反转链表),最终还是挂了。不过塞翁失马,在引擎开发流程中被面试官夸奖图形学掌握得好,跳过二面,成功拿到个人最好的offer。

其他

具体选择什么岗位:

在各公司招聘要求中会有岗位职责及其要求的说明,可以仔细对比和了解技术美术、图形渲染开发、引擎开发等岗位的区别。简单来说,TA注重美术方向的建模、材质、shader;图形注重渲染算法、shader性能,引擎的渲染部分;引擎开发以C++和API为核心,包含了众多的技术方向,不仅包括了渲染、物理、动画、AI等常见方向,还有各种游戏开发涉及的底层方向。(仅供参考,可能不太准确,具体还是以企业要求为准)

关于公司的选择

自认水平太差,大厂难度太高,腾讯流程太长,字节项目拉胯,米哈游半个大厂更是个位数HC,最后大厂只投了黄埔军校。

关于简历项目

考虑到自己非科班的薄弱基础和惰性,我在秋招准备项目时,只定下了一个简单的项目作为简历核心:以C++为基础的递归光线追踪项目。也正是《Raytracing in one weekend》系列所讲的项目。之所以选择这个系列主要有以下几个原因:

1.图形\引擎岗,理想的项目是一个渲染引擎,TA岗理想的项目是从零开始的游戏和shader项目。前后两类岗位本质上已经是两种方向(或者说技术栈),最终二选一选择了前者来进行准备

2.渲染引擎项目需要的基础知识很多,要将这些知识转化为代码成果对于假期还有实验室项目、论文实验要做的我来说,很难做到。

3.《Raytracing in one weekend》系列是基本是傻瓜教程,不存在C++编程上的问题,唯一的问题就是:以代码为基础来理解图形学知识。

4.图形\引擎的核心知识就是C++和图形学,普通的渲染管线可能需要图形API或者较多的代码量,而光线追踪不仅是C++和图形学的结合点,而且可以仅靠少量C++代码就能实现较为可观的“项目成果”。

5.只有能够理解吸收这个系列的基础,并能在这个基础上扩展这个光追引擎的功能,这个“项目”才能叫项目,否则只能说是一个课程作业,很难有竞争力。 5.最后也是最重要的:因为它是“光线追踪”。(游戏玩多了,很难不憧憬这个词🤣

面经

接下来是具体面经(八股)的分享,内容不仅包括我自己实际遇到的,也包括复习时我在牛客收集整理的。(搜索关键字:图形、渲染、引擎、游戏这种字眼,挨个帖子整理) 一共分为三个部分:C++、数据结构与算法、3D数学与图形学及API。各部分复习方法、参考资料可以看上一个帖子 关于操作系统与计网,因为是跨专业,所以我只学习了诸如进程线程区别、TCPUDP区别、三握四挥等高频知识点,一开始还背一背,但是背的始终不是学过的,一被深入提问就不会了,再加上这些科目被问到的次数确实不多,后来再被问到时干脆说没学过了(开摆🤥)

C++

多态

多态的定义、种类、实现

虚函数如何实现多态

虚表指针什么时候产生

虚函数表如何生成,是和类还是对象绑定

纯虚函数

重载重写覆盖的区别, 子类重写了虚函数会对虚函数表有什么影响

多继承的实现?可能出现什么问题

菱形继承下的类大小

类实例的内存存储形式是什么样子的

final和override

基类不使用虚析构函数,会发生什么

构造函数和析构函数能不能是虚函数,为什么

C++在构造函数和析构函数中的异常

智能指针

内存泄露与智能指针

智能指针有什么类型,各自的原理有什么区别

shared_ptr怎么实现多指针指向同一个地址

引用计数如何保证不同类实例的指针之间共享同步

循环引用会在什么情况下产生,如何解决,解决的原理

shared_ptr的代码实现(主要是构造、赋值和析构)weak_ptr呢

智能指针构造与析构时间

野指针的产生原因,解决方法

STL设计模式等

定义一个struct,有int x,char c两个成员,这个结构体的大小?

如果增加一个static int 这个结构体大小怎么变化?

如果在结构体里定义一个虚函数,结构体大小怎么变化?

为什么要内存对齐?

inline与宏区别?

inline函数与普通函数区别?

什么时候会发生浅拷贝?深拷贝是什么?作用?怎么实现?

有哪些数据类型 强制类型转换的种类、区别

模板声明与实现如何能不在同一个头文件

类中静态变量的初始化是什么时候?

说一下左值右值

右值引用与移动构造

move的作用

什么是引用折叠

类中默认构造函数有哪几种

拷贝构造函数和移动构造函数的区别?

static关键字

new与malloc的的区别?

const的用法

了解哪些设计模式?在游戏中分别有哪些应用场景?

一个类在各种情况下取sizeof()的结果

指针和引用的区别?

什么是无效引用?

调用函数的过程?

extern关键字

map底层是什么,说一下红黑树

哪些stl底层是哈希表?

C++ vector底层、扩容机制、insert方法的几种情况

C++ deque数据结构

C++ hash_map的实现

说一下你最熟悉的一个STL容器,讲一下你知道的具体实现细节

实现stack的push 函数

Vector的push_back时间复杂度:均摊时间复杂度为O(1)。因为 vector 的 push_back 是在每次达到 capacity 才会申请新内存,然后复制过去,也就是进行 m * n 次操作,但是每 n 次操作才会进行这样的复制,所以相当于 n 次操作进行 (m + 1) * n 次操作,每次就是均摊 (m + 1),也就是常数时间 O(1)

数据结构与算法

实际遇到的

1.一个二维平面内,有多个矩形,如何根据矩形的重叠情况分组?(所有有重叠的为一组)

2.平时玩什么游戏? 答:LOL,OW,荒野之息。。。 问:让你来设计一个英雄,你用C++写一下英雄的类

3.聊一下你印象比较深刻的游戏,它有什么优秀之处 答:荒野之息的地图设计与任务引导的关系、物体交互设计(苹果、草地、火) 问:点燃草地时,如何判断点燃的是哪一片草地?如何判断苹果是否在火焰中?

4.k个一组反转链表

5.3个数得到24点的算法,4个数的?

6.牛顿法求平方根

7.排行榜设计,要求能显示top100和自身排名

8.数据流实时中位数

9.红黑树和AVL区别?

10.哈希冲突如何处理,无序数组如何设计哈希函数

11.哈希表如何实现O(1)哈希值

12.各排序算法复杂度

由其他面经整理

1.快速排序的最坏情况是什么样?

2.两个栈实现队列?一个栈怎么实现?

3.有序数组合并(倒序插入)

4.一组有序数,删除其中一个数,打乱,如何找到这位数?如果是删除两个数,怎么找?如果删除三个数?

5.怪兽和陷阱都是圆,相交则表示怪兽在圆里,如何求所有在圆里的怪兽。

6.括号匹配

7.环形链表 II

8.实现一个定时器功能,要求实现定时器的注册,更新,注销三个函数。

9.给定一个数组a[n],要求求出接近m的k个数。分析思路,时间复杂度。

10.删除链表中倒数第N个节点

11.如何确定黑盒函数foo(int)的时间复杂度?

12.快速幂

13.快速幂求余

14 14.判断平衡二叉树

15.LRU

16.用vector实现queue

17.数组模拟哈希找数组重复次数最多的小写字母

18.二维数组查找目标值

19.交换两个数字得到最大数字

20.和为目标值的数组对

21.约瑟夫环

22.cv中值滤波的实现?

23.二叉树每个节点有0/1两种值可能,同时有&/|两种操作可能,除叶节点外每个节点的值由两个子节点的值与父节点的操作决定,现在确定根节点的值和所有非叶节点的操作,怎么确定叶节点的值,如果给定整棵二叉树的节点值和非叶节点的操作,怎样翻转最少的叶节点的值使得根节点的值也翻转

3D数学、图形学及其API

实际遇到的

给定点集求凸包 向量点乘和叉乘的几何意义

如何判断点在三角形内?重心坐标 内角和 射线法 点在矩形内?

如何判断一个多边形是凸多边形

已知法线向量和入射向量求反射向量

叉乘求多边形面积

空间两直线求距离

空间点到空间三角形的最近距离

行列式为0的意义

什么是齐次坐标?

齐次坐标能做什么?

它是怎么去区分是一个位置,还是一个方向?

为什么使用齐次坐标,它有什么好处?

如何判断射线与球体相交? 如何优化

法线矩阵是什么

裁剪空间做了什么

视锥体如何定义

一般使用的向量是几维的?矩阵呢?为什么向量是三维,矩阵是四维的呢?

M矩阵是怎么来的?

各矩阵的结合顺序怎么确定?

写出一个旋转矩阵和一个平移矩阵,怎么叠加?

给定M矩阵,能否分解为几种变换矩阵

正交矩阵的定义、特点?

我们的变换矩阵中哪些是正交矩阵?

如何理解特征值和特征向量?写一下相关式子?

旋转矩阵的特征值是?

如果A是二阶矩阵,如何理解特征向量呢?

切变矩阵的特征 如何表示一个平面?

最小二乘法了解吗? 知道欧拉角吗?有什么用?它的优点和缺点是什么?

万向锁遇到过吗?为什么会有万向锁?如何解决?

对四元数有了解吗?作用?如何进行插值?

说一下GPU渲染管线 图形渲染过程中有哪些坐标空间?他们是如何进行变换的?写写具体的矩阵

各空间中,哪些是左手系,哪些是右手系,为什么会有变化

V矩阵的功能?如何推导?

正交投影和透视投影有什么区别?

视口变换的作用是什么,空间的维度是如何变化的

视口变换时深度值如何处理?(存入深度缓冲

NDC是什么?

顶点着色器坐标变换(XX空间、矩阵)

光栅化的定义与作用

顶点着色器的作用

顶点着色器中坐标系的变化,是否必须要经历这些坐标系的变化

片元着色器的作用

片元是什么?和像素有什么不同

什么时候在顶点做光照?什么时候在片元做光照

光栅化的作用 知道哪些光照模型?

分别说一下 Phone模型有哪些光照分量?说一下它们的作用是什么?

BlinnPhong和Phong的区别是什么,这种区别的作用是?

走样产生的原理?如何解决?

MIPMAP原理、作用,如何确定使用哪一层?

法线贴图是怎么存储的?为什么?优点缺点?

存储法线贴图需要注意什么?

伽马矫正是什么?为什么?

HDR是什么?为什么?

什么是色调映射?了解哪些色调映射算法?写一下伪代码

shadowmap实现、缺点、有哪些改进

PCF、PCSS原理 (Games202)

了解哪些抗锯齿方法?分别说一下原理(MSAA、FSAA、SSAA、DLSS等)

有哪几种缓冲?作用是什么

什么是模板测试?有哪些作用 除了用模板测试做阴影,还有什么方法?

alpha混合了解吗

如何渲染半透明的物体?需要注意什么。

深度测试过程、透明非透明物体渲染顺序? 如何确定这些物体渲染顺序?

写过哪些shader?

了解compute shader吗

什么情况下fs的执行次数会小于vs的执行次数(顶点数)?

介绍一下渲染方程

BRDF介绍

菲涅尔项的F0有什么含义

介绍下PBR的原理

PBR的实现需要哪些参数

了解光线追踪吗?路径追踪是什么?

什么是蒙特卡洛积分方法

延迟渲染原理与实现,作用是什么?

提高渲染效率的方法

如何保证稳定帧率

如何优化shader代码?

了解哪些GPU架构

了解哪些图形API?

DX和GL的区别?

GLFW的作用?

GL如何在shader中进行纹理采样?

如果对一个模型仅沿X轴缩放,如何利用M矩阵计算光照?法线乘逆转置矩阵

绕世界坐标中某一物体自身的y轴旋转一定角度,旋转矩阵怎么求

有一个设计好的一个渲染算法,但效率较低,如何最快地分析出vs和fs哪个对效率影响最大

场景内多个同mesh物体,如何根据用户选择实时渲染其中的一部分

了解哪些后处理方法?

高斯模糊的实现?

bloom的实现?

了解NPR吗

卡通渲染的方法?

描边方法了解哪些?区别?优缺点?

由其他面经整理

两条线段相交判断

如何判断射线与三角形相交

如何判断射线与(光追)AABB相交?

给定一个极坐标表示的球面,给定两点,求两点间弧长。

圆和矩阵相交性判断?

凸多边形相交性判断?

射线与1w面片求交?如何加速?

矩阵SVD分解?

数学上如何把一个非线性问题表示成线性问题?比如把一个函数值表示成多项式的和?

多元函数全微分

函数如何求极值?极值的充分、必要条件?

屏幕ui上的2d坐标知道深度的情况下如何推算世界坐标

写一下Phone模型中的镜面光和漫反射光计算的伪代码?

延迟渲染存的位置信息精度问题,为何不直接用深度来还原世界空间的位置

延迟渲染存的法线在哪个空间

延迟渲染怎么用AO

延迟渲染和前向渲染采样深度图的性能对比

G-buffer用了几个RT,格式是什么,

深度图和颜色图采样器的区别是什么

unity的几种管线?有什么区别?

花屏 撕裂 黑屏等故障检测

知道哪些图形API?用过吗?是哪个版本

介绍opengl的渲染管线

glfw是什么 上下文是什么

opengl与openglES区别

帧缓冲有哪些,作用是什么

bufferdata作用

glfinish()glflush()区别

总结

走过半年多的零基础跨行就业路,心里的预期一直在变化:想进大厂→能进游戏行业就行,以后社招再去大厂→要不秋招先国企保个底,春招再战游戏!→竟然OC了。回头再看感慨很多,多少还是有运气成分,春招结束后秋招开始前网易提示我得到了一个秋招绿色通道,考虑到我的笔试成绩,感觉没这个通道可能很难有后续流程了。所以大家可以有针对性的多投多面,有些机会只有尝试了才能发现。不要像我一样米鹅直接没投。

在此总结一下自己的经历和感悟,希望能对想进入游戏行业的同学们有所帮助。

#网易游戏##面试题目##网易互娱##面经笔经##游戏研发#
全部评论
半年图形学从零上岸 人和人确实是不一样的😓
19 回复
分享
发布于 2022-02-17 03:01
这么多东西真的是半年学完的?????
11 回复
分享
发布于 2022-02-24 23:51
饿了么
校招火热招聘中
官网直投
这学习能力就不是一般人能比的
7 回复
分享
发布于 2022-02-17 19:59
4 回复
分享
发布于 2022-01-24 13:20
遗忘是肯定会有的,我从零开始是先开一遍菜鸟教程熟悉了一下,然后开始尝试刷题。八股对着力扣的c++面试突击学了一遍。这时候已经有面试了,面试时记录重点,后来配上侯捷视频和书进行了查漏补缺。面试过的话会分清复习的重点,项目的话确实没有。
3 回复
分享
发布于 2022-03-10 22:03
学长我的情况和你去年类似,可以加个联系方式聊聊嘛!感谢~!
2 回复
分享
发布于 2022-02-19 22:10
能帮忙改下简历么?已私
2 回复
分享
发布于 2022-11-27 09:28 福建
学长 怎么充实自己相关项目经历啊 感觉简历上都没有什么相关的 可以指导一下吗🙏
1 回复
分享
发布于 2022-01-20 13:21
挺好 收藏了
1 回复
分享
发布于 2022-04-13 17:34
大佬,我来啦!吸吸欧气,马上提前批开了~
1 回复
分享
发布于 2022-06-26 22:16
学长,想请问下今年双非本会被卡嘛!
1 回复
分享
发布于 02-26 16:56 广东
请教一下,图形岗和引擎岗在面试的时候区别大吗
点赞 回复
分享
发布于 2022-02-14 12:40
我以前不是这个方向的,但是现在想找这方面的工作,以前的项目都些Python数据处理,参与了些别的方向的论文啥的,简历上可以写吗
点赞 回复
分享
发布于 2022-02-20 20:54
请问大佬,面试完没有通知的话怎么知道是不是挂了,是在招聘app上给hr发消息吗
点赞 回复
分享
发布于 2022-03-02 12:54
学长,今年游戏行业是不是很严俊,是不是不怎么招人啊
点赞 回复
分享
发布于 2022-03-03 22:30
学长我的情况和你类似不过我是想找实习,不知道能加个联系方式请教一下吗 谢谢!
点赞 回复
分享
发布于 2022-03-07 23:48
请问学长,光追渲染器的项目的话面试官会问哪些问题呢😱😱😱
点赞 回复
分享
发布于 2022-03-09 15:48
想请教一下c++的学习是怎样进行的呢?只看书是不是会很容易遗忘,有没有什么推荐的课程或者项目之类的呢?
点赞 回复
分享
发布于 2022-03-10 21:59
想问一下学长软渲染的项目会问些什么
点赞 回复
分享
发布于 2022-03-14 00:35
能请教一下博主,如果要投游戏客户端开发的,还需要着重了解图形学方面的吗?还是说更注重c++算法这些呢?
点赞 回复
分享
发布于 2022-03-16 11:22

相关推荐

今晚面试有什么建议的,友友们#24届软开秋招面试经验大赏##24届秋招同行攻略分享##如何判断面试是否凉了##软件开发投递记录#昨晚结束专业面50min,感觉寄,面试小白面试官提问1. 自我介绍2. 介绍实习项目,算法3. 对游戏行业的了解及开发技术4. Unity项目经验5. 其中遇到什么难题技术相关6. 链表的优缺点7. 链表的实用场景8. 链表和数组的区别9. vector和数组区别10. 类和struct区别(访问权限和继承)11. vector在哪些情况下会出现迭代器失效,哪些不会出现12. 介绍指针和引用13. 多态和虚函数14. 智能指针,shared_ptr实现原理,为什么被叫做强引用剩下一些不记得了手撕题,开屏幕共享循环数组,leetcode原题,比较友好说一下思路,用了什么数据结构和算法,在哪写过...当时脑抽不敢说在leetcode算到过一样,就说项目里用到过生活相关1. 喜欢玩什么游戏2. 了解游戏行业,喜欢玩什么游戏,回去了解他们的技术吗,什么时候开始了解的3. 考过研吗,多少分方便问吗,后续还有考研的打算吗4. 什么时候开始准备考研的,平常时间怎么安排的5. 对于公司加班有什么看法反问(岗位发展,面试小白问了薪资现在后悔问了,后面问有经验的舍友说最好问,我后续还需要学习什么,更新技术栈等等)等结果ing。。。结果:面试不通过,好想经济独立
点赞 评论 收藏
转发
264 1299 评论
分享
牛客网
牛客企业服务