• OpenGL中的二维编程——从简单的矩形开始


    一、OpenGL的组成

    • 图元函数(primitive function)指定要生成屏幕图像的图元。包括两种类型:可以在二维、三维或者四维空间进行定义的几何图元,如多边形;离散实体;位图。
    • 属性函数(attribute function)负责控制图元的外观。这类函数定义了颜色、线型、材质属性、光照以及纹理。
    • 观察函数(viewing function)指定摄像机的属性。OpenGL提供一个虚拟摄像机,我们可相对于由图元函数定义的对象设置该摄像机的位置和朝向。我们也可以控制摄像机的镜头参数,以便制造出广角或长焦效果。
    • 查询函数(query function)允许我们决定某一特定系统的性能以及OpenGL状态变量的取值。
    • 控制函数(control function)允许我们启用或禁用各种OpenGL特性,如消隐、纹理映射和光照等。
    • 输入与窗口函数不属于OpenGL核心库,但是由于它们在交互式程序中的重要地位,这类函数已被包含在GLUT库中。这些函数使我们能够对屏幕中的窗口进行控制并使用鼠标和键盘。

    二、库组织结构

    下图是Linux平台下实现的库组织结构

    对于Windows 或 Macintosh平台,也有一张类似的组织结构图。

    应用程序既可以使用OpenGL、GLU以及GLX库中的函数,也可以直接使用X库或X工具集中的函数。

    另外还有一种折衷的方法是借助GLUT库,这样可以使同一个程序能够在不同的平台下重新编译和运行。

    三、GLUT

    void glutInit(int * argc, char ** argv);
    //初始化GLUT,应在其他GLUT函数和OpenGL函数之前进行调用。
    //glutInit()接收来自main函数的参数,程序可以具体实现相关的方式来使用这些参数

    所有的GLUT函数都是以glut为前缀。

    函数glutCreateWindow()将一个窗口以默认尺寸(300*300像素)显示在屏幕的默认位置上(屏幕左上角)。该函数的参数使我们可为窗口创建一个标题。

    int glutCreatewindow(char * title)
    //在屏幕上创建一个窗口,该窗口的标题由参数title给出。
    //在多窗口情况下,该函数返回一个标识所创建窗口的整数。

    下图是带有GLUT的库组织结构:

     

    四、事件循环和回调函数

    void glutDisplayFunc(void (*func)(void))
    //函数func()在每次需要对窗口重绘时被调用。
    void glutMainLoop()
    //使程序进入无限事件处理循环。该函数的调用应作为main函数最后一条语句出现

    提示:GLUT回调函数的形式是固定的。所以,若要在不同的函数之间进行值传播,可能需要借助全局变量。

    五、矩形的绘制

    void glVertex<234><sifd>(type xcoordinate,type ycoordiante,...)
    void glVertex<234><sifd>(type * coordinates)
    //指定顶点在二维、三维或思维空间中的位置坐标,坐标值的类型可以是short(s)、int(i)、float(f)或double(d)。
    //如果函数名的末尾出现了v,则type为一个指向指定类型的坐标数组的指针。
    void glBegin(GLenum mode)
    //指定mode类型对象的起始点。mode可取GL_POINTS、GL_LINES或GL_POLYGON
    void glEnd()
    //指定顶点列表的终止点

    提示:在顶点列表的末尾不要忘记包含glEnd()。

    void glClear(GLbitfield mask)
    //清空mask指示的所有缓存的位。
    //其中mask可由定义在gl.h中的常量通过逻辑或运算构成。GL_COLOR_BUFFER_BIT指颜色缓存
    void glFlush()
    //强制执行之前缓存的所有OpenGL命令

    六、示例程序

    Github地址

     1 #include <GL/glut.h>
     2 void display()  //定义了所要绘制的图形实体
     3 {
     4     glClear(GL_COLOR_BUFFER_BIT);
     5     glBegin(GL_POLYGON);
     6         glVertex2f(-0.5, -0.5);
     7         glVertex2f(-0.5, 0.5);
     8         glVertex2f(0.5, 0.5);
     9         glVertex2f(0.5, -0.5);
    10     glEnd();
    11     glFlush();
    12 }
    13 
    14 int main(int argc, char ** argv)  //OpenGL的初始化
    15 {
    16     glutInit(&argc, argv);
    17     glutCreateWindow("simple");
    18     glutDisplayFunc(display);
    19     glutMainLoop();
    20 }

  • 相关阅读:
    C#数组
    找不到命名空间命名空间:System.Windows.Forms
    WebService 的创建,部署和使用
    动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
    SQL语句新建表,同时添加主键、索引、约束
    SQLServer Ansi_Padding的用法
    浅析jQuery删除节点的三个方法
    C# JSON 序列化和反序列化——JavaScriptSerializer实现
    命令行启动tomcat,怎么配置
    ojective-c convert to pascal pattern
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/6343194.html
Copyright © 2020-2023  润新知