3D渲染管线

来源:互联网 发布:nodejs 运行js 编辑:程序博客网 时间:2024/05/01 04:59




Vertex ShaderFragment Shader是可编程管线。

Vertex Array/Buffer objects:顶点数据来源,这时渲染管线的顶点输入,通常使用Buffer objects效率更好。在今天的示例中,简单起见,使用的是 Vertex Array;

Vertex Shader顶点着色器通过可编程的方式实现对顶点的操作,如进行坐标空间转换,计算 per-vertexcolor以及纹理坐标;

Primitive Assembly图元装配,经过着色器处理之后的顶点在图片装配阶段被装配为基本图元。OpenGL ES 支持三种基本图元:点,线和三角形,它们是可被 OpenGL ES 渲染的。接着对装配好的图元进行裁剪clip):保留完全在视锥体中的图元,丢弃完全不在视锥体中的图元,对一半在一半不在的图元进行裁剪;接着再对在视锥体中的图元进行剔除处理cull):这个过程可编码来决定是剔除正面,背面还是全部剔除。

 Rasterization:光栅化。在光栅化阶段,基本图元被转换为二维的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。这些片元接着被送到片元着色器中处理。这是从顶点数据到可渲染在显示设备上的像素的质变过程。

Fragment Shader:片元着色器通过可编程的方式实现对片元的操作。在这一阶段它接受光栅化处理之后的fragment,color,深度值,模版值作为输入。

Per-Fragment Operation:在这一阶段对片元着色器输出的每一个片元进行一系列测试与处理,从而决定最终用于渲染的像素。


顶点变换和光照(T&L)


在一个物体被绘制到屏幕之前,必须先计算它的光照,并且将它从3D世界转换到屏幕二维坐标系中(这两个过程称为光照和顶点变换,也就是T&L, Transformation & Lighting)。

 

世界变换

 

世界变换就是将物体顶点坐标从模型空间转换到世界空间。

 

平移变换

旋转变换

 

绕x轴旋转θ角

绕y轴旋转θ角

绕z轴旋转θ角

缩放变换

观察变换

 

以摄像机位置为参考原点,摄像机观察的方向为坐标轴,建立的坐标系称为观察坐标系

 

投影变换

 

将三维物体投影到二维表面上,即投影到虚拟摄像机的胶片上,这个过程就是投影变换。以胶片中心为参考原点的空间坐标系称为投影坐标系,物体在投影坐标系中的坐标称为投影坐标

 

视区变换


物体在投影坐标系中的表示为浮点坐标,通过定义屏幕显示区域(一般为显示窗口大小),将浮点坐标转化为像素坐标的过程称为视区变换,该像素坐标值称为屏幕坐标。例如,如果定义社区大小为宽640像素,高480像素,那么投影坐标(1.0f,05.f)经过社区变换屏幕坐标为(640,240),如果定义视区大小为宽1024像素,高800像素,经过社区变换屏幕坐标为(1024,400)。


顶点着色器(VertexShader)



Attributes:使用顶点数组封装每个顶点的数据,一般用于每个顶点都各不相同的变量,如顶点位置、颜色等。

 Uniforms:顶点着色器使用的常量数据,不能被着色器修改,一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的变量,如当前光源的位置。

Samplers:这个是可选的,一种特殊的uniforms,表示顶点着色器使用的纹理。

Shader program:顶点着色器的源码或可执行文件,描述了将对顶点执行的操作。

 Varying:varying变量用于存储顶点着色器的输出数据,当然也存储片元着色器的输入数据,varying 变量最终会在光栅化处理阶段被线性插值。顶点着色器如果声明了varying 变量,它必须被传递到片元着色器中才能进一步传递到下一阶段,因此顶点着色器中声明的varying 变量都应在片元着色器中重新声明同名同类型的 varying 变量。OpenGL ES 2.0 也规定了所有实现应该支持的最大 varying 变量个数不能少于 8 个。


图元装配


顶点着色器之后,渲染流水线的下一个阶段是图元装配,图元是一个能用opengl es绘图命令绘制的几何体,绘图命令指定了一组顶点属性,描述了图元的几何形状和图元类型。顶点着色器使用这些顶点属性计算顶点的位置、颜色以及纹理坐标,这样才能传到片元着色器。在图元装配阶段,这些着色器处理过的顶点被组装到一个个独立的几何图元中,例如三角形、线、点精灵。对于每个图元,必须确定它是否位于视椎体内(3维空间显示在屏幕上的可见区域),如果图元部分在视椎体中,需要进行裁剪,如果图元全部在视椎体外,则直接丢弃图元。裁剪之后,顶点位置转换成了屏幕坐标。背面剔除操作也会执行,它根据图元是正面还是背面,如果是背面则丢弃该图元。经过裁剪和背面剔除操作后,就进入渲染流水线的下一个阶段:光栅化。


 光栅化和像素处理


光栅化阶段把图元转换成片元集合,之后会提交给片元着色器处理,这些片元集合表示可以被绘制到屏幕的像素。如下图所示:



片元着色器(FragmentShader)



片元着色器对片元实现了一种通用的可编程方法,它对光栅化阶段产生的每个片元进行操作

Varying variables:顶点着色器输出的varying变量经过光栅化插值计算后产生的作用于每个片元的值。

Uniforms:片元着色器使用的常量数据

Samplers:一种特殊的uniforms,表示片元着色器使用的纹理。

Shader program:片元着色器的源码或可执行文件,描述了将对片元I执行的操作。





0 0