美文网首页
OpenGL之基本图元

OpenGL之基本图元

作者: 我的大好时光 | 来源:发表于2018-02-04 17:21 被阅读38次

    OpenGL的基本图元有点(Point)、线段(Line)、多边形(Ploygon)、三角形(Triangle)、四边形(Quadrangle)。组成关系我想大部分人都能够理解:

    • 无数个“点”的线性排列组成----“线段”
    • 多个“线段”可以围成一个“多边形”
    • 多个“多边形”在三维空间中可以围成“多面体”

    有此,可以看出,点是最基本的图元,其他的图元都是由顶点组合构成的,因此我们从点开始介绍。

    点    GL_POINTS 
    
    • 在OpenGL中,“点”称为顶点(Vertex ['vɝtɛks]),通常用一个形如(x, y, z)的三维坐标值表示。

    • 有时候会采用齐次坐标表示,就是一个形如(x, y, z, w)的四元组,可以这样理解这个四元组,前面的(x,y,z)表示“点”所在的方向,而w表示在该方向上的距离比例,所以(x, y, z, w)表示的实际坐标值就是(x/w, y/w, z/w)坐标点。如果w为0,则表示方向为(x, y, z)的无穷远点;如果w=10,表示取(x,y,z)的十分之一作为坐标点(x/10,y/10,z/10)。

    • 一般情况 下,OpenGL 中的点将被画成单个的像素。实际上点还可以更小,虽然它可能足够小,但并不会是无穷小,一个像素内可以描绘多个点,取决于对点大小的设定,默认一个点的大小为一个像素。

    当然我们也可以改变点的大小,函数原型为:
    
    //size 必须大于 0.0f,默认值为 1.0f,单位为“像素”。
    //对于具体的 OpenGL 实现,点的大小都有个限度的。
    //如果设置的 size 超过最大值,则设置可能会有问题,一般情况是不在增大。
    void glPointSize(GLfloat size);
    

    线段

    线段是由两个顶点连接起来形成的图元。线段间的连接方式有三种:
    - 独立线段:图元类型参数--GL_LINES
    - 线段间首尾相连但最终不闭合:折线,图元类型参数--GL_LINE_STRIP
    - 线段间首尾相连最终封口闭合:图形,图元类型参数--GL_LINE_LOOP
    

    对应的图例:


    线段图例.png

    同样的,直线可以指定宽度:

    void glLineWidth(GLfloat width); //width表示线宽,单位:像素
    

    特殊的是线除了直线,还有虚线。可以用虚线连接两个点。

    //在绘制虚线之前必须先启动“虚线模式”: 
    glEnable(GL_LINE_STIPPLE);
    

    虚线有不同的类型,调节函数如下:

    /*
     1.参数pattern是16位二进制数(0或1),如OxAAAA表示1010101010101010
            从低位开始,每一个二进制位代表一个像素, 1表示用当前颜色绘制一个像素,0表示当前不绘制,只移动一个像素位,中间留下一个像素的空白
     2.factor是用来调节二进制位0和1代表的像素个数,如果factor为2,则表示遇到二进制1的时候用当前颜色绘制两个像素,0移动两个像素不绘制
    */ 
     void glLineStipple(GLint factor,GLushort pattern);
    

    多边形

    连接方式:
    - 按点的定义顺序依次连接:图元类型参数--GL_POLYGON
    - 从第1个点开始,每三个点一组画一个三角形,三角形之间是独立的:图元类型参数--GL_TRIANGLES
    - 从第三个点开始,每点与前面的两个点组合画一个三角形,即线性连续三角形串:图元类型参数--GL_TRIANGLE_STRIP
    - 从第三个点开始,每点与前一个点和第一个点组合画一个三角形,即扇形连续三角形:图元类型参数--GL_TRIANGLE_FAN
    

    对应的图例:


    多边形图例.png

    多边形的正反两面

    1.多边形为什么会有正反面这一说法呢?举个简单的例子。

    虽然多边形是二维的,但是我们知道三维物体可以理解为多边形围成的,也就是说在三维空间物体上有二维多边形的存在。

    一张“正方形”纸片,如果极限的薄,我们可以认为是一个多边形(正方形),那么纸仍然会存在两面,纸的正反面。更具体一点,如果我们用同大小6张正方形的纸片围成一个正方体,那么正方体的任何一个面都是一个多边形,而且这个多边形是有正反面,朝外的你能看到的部分是正面(假设),那么朝内的看不到的那部分就是反面。同样的道理,OpenGL要区分多边形的正反面。那么到底怎么定义正面或者反面呢?

    有一个函数来定义:

    glFrontFace(GL_CCW);//设置点序列逆时针方向围成的多边形为正面
    glFrontFace(GL_CW); //设置点序列顺时针方向围成的多边形为反面
    

    设置这个的原因是,默认情况下,OpenGL绘制三维物体时两面都会绘制,而实际的时候很多面我们是看不到的,如物体朝内方向的多边形,还有一些物体间遮挡的情况导致有些多边形是不可见的,因此为了提高性能,我们需要剔除这些不必要的绘制。

    glEnable(GL_CULL_FACE); //来启动剔除功能
    glCullFace(); //参数可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,表示剔除多边形的哪种面,设定后该类型的多边形不绘制
    

    相关文章

      网友评论

          本文标题:OpenGL之基本图元

          本文链接:https://www.haomeiwen.com/subject/apnmzxtx.html