我是靠谱客的博主 可靠天空,最近开发中收集的这篇文章主要介绍[OpenGL] 从顶点坐标到光栅化(渲染管线),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.输入对象信息

 

        我们一般用三维网格来表达三维物体。对于建好的模型(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] 从顶点坐标到光栅化(渲染管线)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部