“渲染管线是干什么用的?”
“OpenGL、DirectX和渲染管线的关系?”
“渲染管线谁来开发?”
“为什么一些游戏引擎厂商也在做渲染管线?”
这是笔者在研究时曾碰到过的一些问题。看了大神们的解答,理解如下。理解可能略有浅薄,之后会不断学习持续更新:
1. 渲染管线(render pipeline)是什么
告诉GPU怎么进行图形渲染的架构
GPU是什么?专门用来处理图像的芯片。CPU作为计算机的大脑调度事情+处理事情,一个人搞不定了,出现GPU帮助CPU分担一部分事情
分为3个大步骤,应用阶段(CPU把要处理的数据发给GPU)、几何阶段(处理模型,加光影、剪裁等)、光栅化阶段(把3D模型“像素化”,使其能在屏幕是显示出来)
具体步骤细节详见“猴子也能看懂的渲染管线(Render Pipeline)”
1)应用阶段:CPU把要处理的数据(渲染图元)发给GPU
2)几何阶段:输出顶点信息
什么是顶点信息(Vertex)?任何3D模型都是由三角形/四边形构成。顶点信息=每个三角形/四边形的顶点的xyz坐标。知道顶点坐标,连线,就能画出3D模型
包括~7个子步骤:
①CPU把一部分图元信息存起来,用于非渲染场景(例如一面墙,发给GPU渲染,还要留着用于计算物体碰撞)。发Draw Call指令给GPU,让GPU开工。
②顶点着色器,进行模型转化与相机转换。顶点的坐标用于描述在一个“世界”中它的位置,但是为了“拍摄”这个模型,需要告诉计算机这个模型相对摄像机的位置。需要坐标的转化,把之前的世界坐标转化为相对摄像机的坐标。还可以进行光照处理,给模型加上光影。
③曲面细分着色器(Tessellation Stage):给模型多加些顶点,使模型更圆滑。或者增加细节,比如把圆球变成陨石。
④几何着色器(Geometry Shader):改、删顶点。(和上一步区别by我的理解,请大佬指正:曲面细分着色器更细节,改细节形状,比如表面凹凸;几何着色器改大的形状,比如圆球变成一半)。
⑤投影:把3D图形2D化,降维~。从而使其能显示在我们的2D屏幕上。
⑥剪裁:把屏幕“看”不到的部分去掉,不用渲染,节省资源
⑦屏幕映射:屏幕是由尺寸去别的,调整模型坐标系
3)光栅化阶段:即”像素化“。屏幕由像素构成,要让模型显示在屏幕中。
包括 个子步骤
①图元组装:把点连成线,组成三角形。
②三角形遍历(Triangle Traversal):确定填色的区域/像素点。
③片元着色器:确定每块(片元)填什么颜色。
④逐片元操作(Per-Fragment Operations):测试(Test)并合并片元,完成上色。测试过程中会进行剪裁、深度测试(设置渲染物体之间的遮挡关系)
2. OpenGL、DirectX和渲染管线的关系?
OpenGL、DirectX是实现渲染管道的一套API。整个渲染管线需要调用很多应用程序。使用OpenGL、DirectX后,程序员无需自己写代码,直接调用即可(例如烟雾效果不用自己写,直接调就行)
二者的区别?
OpenGL是Khronos开发的
DirectX是微软开发的
二者的管线流程、允许开发者配置的部分略有不同。二者各有优劣,暂不展开
3. OpenGL、DirectX和GPU硬件的关系?
渲染管线包括两部分,和硬件GPU强相关的,开发者不能改的;以及开发者可配置的部分。前一部分需要硬件厂商基于OpenGL/DirectX调整配置
OpenGL/DirectX会提供“说明书”(OpenGL规范)给GPU厂商(NVIDIA等)
4. 谁来开发渲染管线?渲染管线涉及到哪些公司?
- GPU公司:需要根据OpenGL/DirectX,调整硬件
- 微软、Khronos:运营维护OpenGL/DirectX
- 游戏开发者:基于自己需求,用OpenGL/DirectX等开发游戏
遗留问题:
- 渲染管线和游戏引擎商的关系?
- 渲染管线和OS厂商的关系?
参考资料:感谢各位大神答疑!