概述
一.输入对象信息
我们一般用三维网格来表达三维物体。对于建好的模型(obj)而言,它是由如下数据表达的:
后两者不是必须的,但我们假设它存在,以方便我们讨论渲染管线。
法线方向主要用于指定正反面,它参与了很多运算,如背面消隐、光照计算……在我们没有指定的情况下,openGL会根据顶点绘制的顺序按右手定则的方向为正面。
索引是用于指定顶点(或者纹理坐标)是以怎样的方式组成一个个三角形面片的。
二.从世界坐标系经过模型变换到视区坐标系
假设我们已经导入了一系列obj,每个三维网格有着自己的局部坐标系,我们通过平移、旋转、缩放,首先把顶点从局部坐标系转换到世界坐标系。
接下来,我们通过glLookAt指定了我们的视区坐标系。我们指定了头顶向上的方向,以及眼睛的位置,望向的位置。用户指定的两个向量不一定是垂直的,openGL会根据这两个向量所在的平面,计算垂线,得到第三个维度的向量(按右手坐标系方向),然后再依据视线向量和第三维度向量所在的平面,计算垂线,更新头顶向上的方向向量(与原来的夹角小于90度即可),这样就得到了正交的坐标系。
然后,我们再把物体从世界坐标系变换到视区坐标系。(具体变换的过程就是线性代数方程的求解)
三.根据光照、纹理、材质信息,计算顶点的颜色分量
首先,在已知光照、材质相关信息的条件下,我们计算颜色分量。具体过程是这样的:
1. 输入的信息是面法线,对于一个顶点,我们求其所有相接面法线的平均法线,得到顶点法线方向。
2. phong shading:
利用双线性插值计算多边形内部点的法线方向,然后根据phong光照模型计算每个点的rgb值
或者Gouraud Shading:
先利用phong光照模型计算每个顶点的颜色分量,再利用双线性插值计算多边形内部点的颜色分量。
phong光照模型:
(ka为环境反射系数,kd为漫反射系数,ks为镜面反射系数,对所有特定光源求和,并有kd+ks=1)
以上参数都是用户在编程过程中指定,或者模型导入时加载的。
(1)计算边上每个点的分量:D = a A + (1-a)B
(2)计算内部点的分量:F = b D + (1-b)E
3.纹理映射
根据用户指定的过滤方式进行纹理到顶点的映射,需要处理纹理大小与映射对象大小不一的情况(采样)。最终得到的是每个点的颜色分量。
如果你制定了纹理与光照混合,这两种方式得到的颜色分量将会以不同方式叠加。
四.投影
可以指定正投影和透视投影。
在openGL中,我们使用glOrtho来指定正投影,用gluPerspective来指定透视投影,前者是一个立方体,后者则是一个四棱台的区域。正投影的运算比较简单,可以用相似三角形求出,而透视投影则相对复杂一些。
五.变换到窗口坐标
我们使用glViewport来设置这一过程,得到最终屏幕上显示的部分,并进行裁剪。
六.光栅化、消隐
注意到这个时候我们得到的还是顶点信息,我们开始用扫描线进行光栅化处理,我们自上而下,一行行地处理;扫描过程中可以利用增量的思想进行加速,它实际上就是DDA算法的实现,可以用特定数据结构-活性边表来维护边表拓扑信息,加速这一过程。
对于填充而言,根据遇到交点个数的奇偶性来判定是否绘制像素,在这里要特别处理拐角处的点。在填充过程中,我们同时进行消隐,维护z-buffer。
最后
以上就是可靠天空为你收集整理的[OpenGL] 从顶点坐标到光栅化(渲染管线)的全部内容,希望文章能够帮你解决[OpenGL] 从顶点坐标到光栅化(渲染管线)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复