面试问答汇总

图形学相关

渲染管线

顶点数据 => 顶点着色器 => 曲面细分 => 几何着色器 => 图元装配 => 裁剪剔除 => 光栅化 => 片元着色器 => 测试混合

Unity轻量级渲染管线

又称通用渲染管线,区别于Unity内置渲染管线,仅保留很小的C++内核,暴露出更多的接口来支持C#脚本自定义渲染管线。特点为注重性能,单通道前向渲染,Shader Graph支持。而Unity内置渲染管线则更加通用而功能强大。

渲染为什么以三角形为基础
  • 任意三点必然共面。
  • 三角形是最简单的多边形。
  • 三角形经多种转换之后,仍然是三角形,对于仿射转换和透视转换成立。
  • 几乎所有商用图形加速硬件都是为三角形光栅化而设计的。
人物阴影渲染
两个立方体之间的阴影渲染
Shadow Map的基本原理

先从光源位置观察渲染一遍深度信息保存,第二遍渲染时将物体的坐标转换至光源观察坐标,和之前记录的深度比较,判断物体是否在阴影内。

PBR主要参数

以Unity标准材质为例:

  • Albedo 反射率(漫反射)
  • Metallic 金属度
  • specular 高光度(镜面反射)
  • Smoothness 光滑度
  • Occlusion 环境光遮蔽贴图
  • Normal 法线贴图
  • Emission 自发光贴图

扩展链接:https://zhuanlan.zhihu.com/p/53086060

光栅化的几种方法

线段扫描转换:

  • 数字微分画线算法DDA
  • Bresenham光栅化算法

多边形填充:

  • 扫描线填充算法
BRDF的物理含义

双向反射分布函数:

双向:入射方向和观察方向(分别为BRDF的两个输入)

BRDF:描述了入射光线经过某个表面反射后如何在各个出射方向上分布

想象你有一个不透明的桌面,一个激光发射器。你先让激光向下垂直地射在那个桌面上,这样你就可以在桌面上看到一个亮点,接着你从各个不同的方向来观察那个亮点,你会发现亮点的亮度随着观察方向的不同而发生了改变。然后你站着不动,改变激光发射方向和桌面的夹角,你又会发现亮点的亮度发生了改变。这就是说,一个表面对不同的光线入射角和反射角的组合,拥有不同的反射率。BRDF就是用来对这种反射性质进行定义的。

https://www.zhihu.com/question/20286038

引擎相关

游戏引擎主要模块

渲染、物理、动画、AI、输入、内存管理、资源管理、编辑器、网络、UI

C#相关

C#拆装箱

装箱:值类型变量转变为引用类型Object存储在堆内存中

拆箱:引用类型Object转变为值类型存储在线程栈中

ArrayList(每个元素为Object类型)中存取Vector3(值类型)时分别用到装拆箱操作。

C#结构体与类的区别
  1. 结构体是值类型,类是引用类型
  2. 结构体不能被继承,但是结构体能够继承接口
  3. 结构体不能包含显式默认构造函数,没有析构函数;类有默认构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。

C++相关

数据结构相关

算法相关

项目相关