这篇文章总结一下图形学在游戏开发工程师面试时常考(可能会考)的问题。虽然图形学在面试中的比重比较小,但是还是要复习一下的。图形学的考点分为三部分,一是渲染管线,二是数学尤其是线性代数和三维几何。
一、渲染管线
1.1 有那几个坐标系(空间)?如何在空间之间转换?
有五个坐标系,分别是:
- 物体坐标系(本地坐标系)Local Space 或 Model Space
- 世界坐标系 World Space
- 观察者坐标系(摄像机坐标系)View Space
- 裁剪空间 Clipping Space
- 屏幕空间 Screen Space
其中前四个矩阵之间需要通过
model, view , projection矩阵变换,裁剪空间到屏幕空间通过
视口变换进行;前三个是三维空间,后两个是二维空间。
图1.1 坐标系(空间)的转换
所有的变换都发生在顶点着色器,经过顶点着色器,所有顶点都变成了屏幕上的二维坐标,下一步进行图元装配后进入几何着色器。
1.2 三个重要的空间变换矩阵?作用?
需要注意这三个矩阵都在顶点着色器中应用。
- Model matrix 模型矩阵。进行从物体坐标到世界坐标的转换。控制了物体的平移、旋转、缩放。在3D建模软件中为模型坐标,导入游戏后使用model matrix 进行大小、位置、角度的设置
- View matrix 观察矩阵。将世界坐标系变换到观察者坐标系,通过一些列平移、旋转的组合来移动整个场景(而不是移动摄像机,摄像机 是一个虚拟概念,事实上代码中并没有摄像机camera,而是用view matrix来表示摄像机,然后把view matrix附加到每一个物体,来模拟摄像机),用来模拟一个摄像机
- projection matrix 投影矩阵。将观察者坐标系转换到裁剪坐标系。将3D坐标投影到2D屏幕上,裁剪空间外的顶点会被裁剪掉,投影矩阵指定了坐标的范围。
1.3 视口变换是什么?
视口变换发生在投影到2D屏幕后,将投影之后归一化的点映射到屏幕上指定的一块区域。在OpenGL中,通过glViewPort指定。
1.4 渲染管线的流程?
下面的图更形象
其中,gl_Position在从顶点着色器输出后,会由OpenGL自己进行归一化和视口变换:
而
片段处理程序的input是顶点处理程序的output经过了插值以后得到的值。
1.5 三种着色器分别有什么用?完成了什么过程?
- 顶点着色器。计算顶点的位置,并将顶点投影在二维屏幕上。
- 几何着色器。将形状(图元)划分为更多的形状(图元),影响后序的插值结果。
- 片段着色器。根据顶点着色器和几何着色器的输出插值,计算每一个片元的颜色。之后进行测试和混合后生成最终的像素。
1.6 什么是光栅化?
光栅(栅格化或者像素化)化负责的是整个渲染过程中的几何成像环节,把几何图元(点、线,面)投影到成像平面并
确定哪些像素或采样点被图元覆盖。举例:
- 输入,一个三角形的三个顶点,(x0,y0,z0,w0) (x1,y1,z1,w1) (x2,y2,z2,w2)
- 输出,这个三角形会覆盖屏幕上哪些像素,可以认为是 Point2d [ ]
1.7 OpenGL中有哪几种缓冲?都有什么用?
- 帧缓冲Frame Buffer, 用于创建零时的渲染上下文,帧缓冲是一些二维数组和OpenG所使用的存储区的集合:颜色缓存、深度缓存、模板缓存和累计缓存。默认情况下,OpenGL将帧缓冲区作为渲染最终目的地。此帧缓冲区完全由window系统生成和管理。这个默认的帧缓存被称作“window系统生成”(window-system-provided)的帧缓冲区。
- 颜色缓冲 Color Buffer, 包含每个象素的颜色信息。颜色信息可以是颜色索引值(在颜色索引方式下),也可以是颜色的红、绿、蓝3个分量(在RGBA方式下),还可以存放表示物体透明程度的Alpha值。
- 深度缓冲 Depth Buffer, 包含每个象素的深度值。深度值与z坐标有关,描述物体上某点距离观察点的远近,也可以称它为Z缓存(Z Buffer) 。
- 模板缓冲 Stencil Buffer, 包含物体的模板值。模板值具有屏蔽作用,用于控制绘制的区域,使屏幕上某些区域可画,某些区域不可画。
- 累积缓存(Accumulation Buffer) 包含颜色信息。其可以合成一系列的绘制结果,实现某些特殊效果。
- 顶点缓冲 Vertex Buffer, 用于缓存顶点数据
- 元素缓冲 Element Buffer,用于缓存顶点序号数据
1.8 Alpha 混合的几种方式?
通用公式: