当前位置: 首页 > news >正文

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 }

 

相关文章:

  • Laravel 建站随笔
  • PHP面向对象深入研究之【命名空间】与【自动加载类】
  • Lucene的各中文分词比较
  • altiium designer改变图纸大小
  • 自动化Oracle数据库静默安装
  • 数字1的数量
  • 消息中间件的应用——谈谈秒杀(转)
  • 买二手房不如买新房
  • 基本数据结构——栈
  • JAVA入门[2]-安装Maven
  • 2017《Java技术》预备作业02
  • makefile 判断 64bit or 32 bit
  • Hadoop学习笔记一
  • 转入墙内:SAS HBA crossflashing or flashing to IT mode, Dell Perc H200 and H310
  • 循环引用问题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【面试系列】之二:关于js原型
  • Docker下部署自己的LNMP工作环境
  • Hibernate【inverse和cascade属性】知识要点
  • tweak 支持第三方库
  • vue学习系列(二)vue-cli
  • Web标准制定过程
  • 基于Android乐音识别(2)
  • 记一次删除Git记录中的大文件的过程
  • 来,膜拜下android roadmap,强大的执行力
  • 我看到的前端
  • 带你开发类似Pokemon Go的AR游戏
  • # include “ “ 和 # include < >两者的区别
  • (3)STL算法之搜索
  • (笔试题)合法字符串
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (剑指Offer)面试题34:丑数
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)memcache、redis缓存
  • (转)甲方乙方——赵民谈找工作
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET建议使用的大小写命名原则
  • .NET企业级应用架构设计系列之结尾篇
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Service注解让spring找到你的Service bean
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [BJDCTF2020]The mystery of ip1
  • [C#] 我的log4net使用手册
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [DL]深度学习_Feature Pyramid Network
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [GYCTF2020]Ez_Express
  • [Hive] 常见函数
  • [IE技巧] IE 中打开Office文件的设置
  • [js] 正则表达式