地产宣传片制作|三维图形渲染管线
三维图形渲染管线就是将三维场景转化为一幅二维图像的过程。
图像中物体所处位置及外形由其几何数据和摄像机的位置共同决定,物体外表是受到其材质属性、光源、纹理及着色模型所影响。
① 准备场景数据
-
加载模型:Mesh、Material、Shader、Texture(硬盘 --> 内存 --> 显存)
-
摄像机(位置、朝向、视锥体)
-
光源(位置、类型等参数信息)
② 裁剪和剔除 :视锥裁剪、背面剔除、遮挡剔除 (Occlusion Culling)
③ 计算模型视图矩阵
④ 设置渲染状态(RenderState)
渲染管线内部维护着一些状态值。在我们调用渲染API函数进行绘制之前我们需要设置这些状态值。
这些状态值指导GPU如何渲染我们传递到显存的模型和纹理数据。我们称这些状态值为“渲染状态(Render States) ”。
渲染状态包括Shader、Texture、Material、Light内部定义的各种状态等
最后,发起DrawCall调用
Geometry(几何阶段):负责与每个渲染图元打交道,进行逐顶点、逐多边形的操作。
其重要任务是把顶点坐标变换到带有深度的屏幕空间中,再交给光栅器进行处理。
可进一步分割成:模型视图变换,顶点着色,[曲面细分],[几何着色],投影,裁剪及屏幕映射
模型变换:将模型从模型空间变换到世界空间
视图变换:将各个模型从世界空间变换到眼空间(摄像机处于原点)
通常会把这两个变换矩阵结合成modelview矩阵,并将这个过程称之为模型视图变换
顶点着色器:主要功能是修改顶点属性。如:通过传入模型视图矩阵(MVP)进行顶点空间变换(位置属性)、逐顶点光照(颜色属性)、纹理坐标变换(uv属性)等
顶点着色器的处理单元是顶点,也就是说,输入进来的每个顶点都会调用一次顶点着色器。
顶点着色器只能对输入顶点的相关属性进行修改、创建和忽略,不可以创建或销毁任何顶点,而且无法得到顶点与顶点间的关系。
输入一般是一个变换矩阵和一个相对坐标;输出为眼空间中的坐标及每个顶点所附带的其他属性,如颜色、纹理坐标
曲面细分着色器:用于细分图元,分为3个阶段。
-
Control Shader,负责把控后续阶段的初始化操作,例如细化程度(可编程)
-
处理Control阶段的输出,细化Patch数据(不可编程)
-
Evaluation Shader的输入为Patch数据;输出数据为顶点着色器所应输出的数据,但是是批量的(可编程)
几何着色器:输入是1个图元,输出是N个图元(N>=0)
通过Shader程序可以指定Geometry Shader对顶点信息进行增减。还有,因为实际增减的是图元顶点,所以对各种的线段、多边形、粒子等图元也可以进行增减。
利用Geometry Shader的各种方法被创造出来,因为可以自由的生成多边形,那么就可以在地面上生长出草的多边形,或者让3D角色生长出毛发等是最基本的使用方法。
在游戏中,还可以把不需要做逻辑交互处理的例如火花等特效的表现,使用Geometry Shader来生成。
注:Geometry Shader通常是在display driver中实现的,也就是说其实是由CPU负责计算,当重新返回GPU的VS时,对流水线的影响很大,所以Geometry Shader的实际效能并不高,甚至是非常低
投影:分为透视投影与正交投影;在眼空间将模型从三维空间投影到二维平面(D3D投影平面为z=1.0,OpenGL为z=-1.0;为了便于理解,可将其定义为视景体近裁截面)
,就找中视觉