计算机图形学面试资料整理
- 1 什么是渲染管线
- 2 有那几个坐标系(空间)?如何在空间之间进行转换?
- 3 三个重要的空间变换矩阵
- 4 视口变换是什么?
- 5 顶点缓冲对象(Vertex Buffer Objects,VBO)
- 6 顶点数组对象(Vertex Arrary Object,VAO)
- 7 渲染管线的流程
- 8 三种着色器有什么用?各完成了什么过程?
- 9 什么是光栅化?
- 10 OpenGL中有哪几种缓冲?都有什么用?
- 11 为什么要用齐次坐标系
- 12 片段和像素的区别?
- 13 深度缓存算法(zbuffer算法)
- 14 光照计算处理共有三个部分:
- 15 反走样原理是什么?如何实现的
- 16 为什么会有锯齿?抗锯齿怎么消除?
- 17 为什么矩阵变化需要用4*4
- 18 OpenGL渲染流水线怎样提高渲染效率?
- 19 如何绘制一个三角形
- 绘制半透明物体
1 什么是渲染管线
渲染管线又称渲染流水线,它是图形图像从数据一步一步形成最终输出的画面所要经历的各种操作过程。
2 有那几个坐标系(空间)?如何在空间之间进行转换?
物体坐标系(本地坐标系)Local Space 或 Model Space
世界坐标系 World Space
观察者坐标系(摄像机坐标系) View Space
裁剪空间 Clipping Space
屏幕空间 Screen Space
其中前四个矩阵之间,主要通过model, view, projection矩阵进行相关的变换, 裁剪空间到屏幕空间通过视口变换进行;前三个是三维空间,后面两个是二维空间。
3 三个重要的空间变换矩阵
- MVP矩阵即模型矩阵,观察矩阵和投影矩阵,前两个矩阵都是由上面三种基础矩阵变换生成的。
- Model matrix 模型矩阵。进行物体坐标系到世界坐标系的转换。控制了物体的平移、旋转、缩放。在3D建模软件中为模型坐标,导入游戏后使用model martrix进行大小、位置、角度的相关设置。
- View matrix 观察矩阵。将世界坐标系变换到观察者坐标系,通过一些平移、旋转的组合来移动整个场景(而不是去移动摄像机,摄像机是一个虚拟的概念,事实上代码中并没有摄像机camera, 而是用view martix来表示摄像机,然后把view matrix附加到每一个物体,来模拟相关的摄像机操作),用来模拟一个摄像机。
- projection matrix 投影矩阵。将观察者坐标系转换到裁剪坐标系。将3D坐标投影到2D屏幕上,裁剪空间外的顶点会被裁掉,投影矩阵指定了坐标的范围。
4 视口变换是什么?
视口变换发生在投影到2D屏幕后,将投影之后归一化的点映射到屏幕上指定的一块区域。在OpenGL中,是利用glViewPort函数来进行指定的。
5 顶点缓冲对象(Vertex Buffer Objects,VBO)
顶点缓冲对象VBO是在显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标,顶点法向量,顶点颜色数据等。
在渲染时,可以直接从VBO中取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CPU传输数据,处理效率更高。所以可以理解为VBO就是显存中的一个存储区域,可以保持大量的顶点属性信息。并且可以开辟很多个VBO,每个VBO在OpenGL中有它的唯一标识ID,这个ID对应着具体的VBO的显存地址,通过这个ID可以对特定的VBO内的数据进行存取操作。
6 顶点数组对象(Vertex Arrary Object,VAO)
VBO保存了一个模型的顶点属性信息,每次绘制模型之前需要绑定顶点的所有信息,当数据量很大时,重复这样的动作变得非常麻烦。VAO可以把这些所有的配置都存储在一个对象中,每次绘制模型时,只需要绑定这个VAO对象就可以了。
VAO是一个保存了所有顶点数据属性的状态结合,它存储了顶点数据的格式以及顶点数据所需的VBO对象的引用。VAO本身并没有存储顶点的相关属性数据,这些信息是存储在VBO中的,VAO相当于是对很多个VBO的引用,把一些VBO组合在一起作为一个对象统一管理。
7 渲染管线的流程
- 顶点数据是一些顶点的集合,顶点一般是3维的点坐标组成。
基本图元(Primitives)包括点,线段,三角形等,是构成实体模型的基本单位,需要在传入顶点数据的同时通知OpenGL这些顶点数据要组成的基本图元类型。 - 顶点着色器(Vertex Shader)包含对一些顶点属性(数据)的基本处理。
- 基本图元装配(Primitive Assembly)把所有输入的顶点数据作为输入,输出制定的基本图元。
- 几何着色器(Geometry Shader)把基本图元形式的顶点的集合作为输入,可以通过产生新顶点构造出新的(或是其他的)基本图元来生成其他形状。
- 图形,创建出更加平滑的视觉效果。 - 光栅化(Rasterization)即像素化,把细分着色器输出的基本图形映射为屏幕上网格的像素点,生成供片段着色器处理的片段(Fragment),光栅化包含一个剪裁操作,会舍弃超出定义的视窗之外的像素。
- 片段着色器(Fragment Shader)的主要作用是计算出每一个像素点最终的颜色,通常片段着色器会包含3D场景的一些额外的数据,如光线,阴影等。
- 测试与混合是对每个像素点进行深度测试,Alpha测试等测试并进行颜色混合的操作,这些测试与混合操作决定了屏幕视窗上每个像素点最终的颜色以及透明度。
在整个渲染管线中需要自定义处理的主要是顶点着色器和片段着色器。
8 三种着色器有什么用?各完成了什么过程?
- 顶点着色器:计算顶点的位置,并将顶点投影在二维屏幕上。
- 几何着色器:将形状