一、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<><sifd>(type xcoordinate,type ycoordiante,...)
void glVertex<><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地址

 #include <GL/glut.h>
void display() //定义了所要绘制的图形实体
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
} int main(int argc, char ** argv) //OpenGL的初始化
{
glutInit(&argc, argv);
glutCreateWindow("simple");
glutDisplayFunc(display);
glutMainLoop();
}

OpenGL中的二维编程——从简单的矩形开始的更多相关文章

  1. Swift 二维码扫描 简单实现

    3.30看视频  学到了二维码简单的实现 还有一些动画的实现  今天就先记录一下二维码扫描的简单实现  不太好记手写一遍 学习的基础在于模仿嘛 创建一个实现二维码扫描的步骤 1.首先是懒加载创建 会话 ...

  2. Java中的二维数组

    Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空 ...

  3. 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/14450809 转载请注明出处:http://blog.csdn.net/xiaanming/ ...

  4. TensorflowTutorial_二维数据构造简单CNN

    使用二维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 图像和一些时序数据集都可以用二维数据的形式表现,我们此次使用随机分布的二位数据构造一个简单的CNN-网络卷积- ...

  5. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  6. Android 基于google Zxing实现对手机中的二维码进行扫描

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809 有时候我们有这样子的需求,需要扫描手机中有二维码的的图片,所以今天实现的 ...

  7. FastReport 中添加二维码功能.(Delphi)

    http://www.cnblogs.com/fancycloud/archive/2011/07/24/2115240.html FastReport 中添加二维码功能.(Delphi)   在实际 ...

  8. Swift开发小技巧--识别选中照片中的二维码

    识别选中照片中的二维码 点击相册按钮,打开用户相册 @IBAction func photoBtnClick(sender: AnyObject) { // 打开相册 // 1.判断是否能够打开相册 ...

  9. C#中读取二维数组每位的长度

    C#中的二维数组,如int[,] A=new int[a,b];则 a=A.GetLength(0);即可获得二维数组中第一维的长度. b=A.GetLength(1);即可获得二维数组中第二维的长度 ...

随机推荐

  1. org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint

    org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint-Xms2024m -Xmx2024m -Dlog.file ...

  2. C++11 constexpr使用

    C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...

  3. linux命令(37):paste,合并两个文件,对应行为一行

    paste的格式为: paste -d -s -file1 file2 选项的含义如下: -d 指定不同于空格或t a b键的域分隔符.例如用@分隔域,使用- d @.如果不指定,默认用空格分割 -s ...

  4. ZOOKEEPER解惑[转]

    今年年初的时候,写了一篇ZooKeeper的入门文章<初识ZooKeeper>,一直到这一周,才有时间将ZooKeeper整个源码通读了一遍.不能说完全理解了ZooKeeper的工作原理与 ...

  5. Vue2键盘事件:keydown/keyup...

    Vue2键盘事件:keydown/keyup... 1.使用 <!DOCTYPE html> <html> <head> <title></tit ...

  6. 多媒体文件格式之AVI

    [时间:2016-07] [状态:Open] AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件 ...

  7. 多媒体文件格式之RMVB

    [时间:2016-07] [状态:Open] RM/RMVB是Real公司私有的封装格式,常见的后缀形式是rm.ra.rmvb. 通常封装的都是real转悠的编码格式,比如音频中的sipro.cook ...

  8. shell脚本输出带颜色字体

    #!/bin/bash # #下面是字体输出颜色及终端格式控制 #字体色范围:30-37 echo -e "\033[30m 黑色字 \033[0m" echo -e " ...

  9. php阿里云oss文件上传

    php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...

  10. Android 避免APP启动闪黑屏(Theme和Style)

    前几天Boss就反应说,机器每次启动程序都会闪一下黑屏,这个客户不接受.没办法,只能想想怎么解决,最后找到了下面的方法.闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和on ...