OpenGL入门和示例程序

大家好,今天雅乐网给大家介绍一下OpenGL的一些基本语法和一个简单的示例程序。

OpenGL是什么呢?说简单一点,就是一个图形软件包,它提供了许多函数供我们调用。我们看看维基百科上的说法

开放图形库(英语:Open Graphics Library,缩写为OpenGL)是个定义了一个跨编程语言、跨平台的应用程序接口(API)的规范,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟实境、科学可视化程序和电子游戏开发。

因为不同的平台对图形的处理不一样,编程时需要分别对待。但是有了这个规范化的OpenGL,我们可以轻松写出跨平台的图形应用。而且直接使用OPenGL提供的函数非常方便,简化了开发过程。目前OpenGL的规范管理者包括SGI,Microsoft,Intel,IBM,SUN等知名公司,已经成为实际上的工业标准。与之类似的还有微软的DIrect X和Adobe的Postscript等。

OpenGL的绘制流程

OpenGL位于操作系统和应用软件之间,给软件开发提供支持。

OpenGL在计算机系统中的层次

OpenGL的绘制流程如下图所示。软件调用OpenGL提供的api函数,OpenGL的函数把绘制图形的命令送到命令缓冲区,命令缓冲区的数据会进行一些变换、光照,投影,将结果数据送到光栅化流程中,最后,光栅化的结果被送入帧缓存,图像就显示在屏幕上了。

一个简单的OpenGL绘制流程图

注意:只有命令缓冲区被清空时,缓冲区的命令和数据才会传递给下一个阶段,OpenGL命令才会执行。

OpenGL的函数库

OpenGL主要由以下几个函数库组成。

  1. OpenGL核心库。以gl为前缀,支持所有OpenGL平台。主要功能:常规和核心图形处理。
  2. OpenGL实用程序库,以glu为前缀,支持所有OpenGL平台。主要功能:通过调用核心库实现复杂功能,例如纹理映射、坐标变换。
  3. OpenGL编程辅助库,以aux为前缀,并不支持所有的平台。主要用于窗口管理、输入输出和简单三维形体绘制。
  4. OpenGL实用程序工具包(GLUT),以glut为前缀,支持所有平台。主要提供基于窗口的工具,例如创建窗口、菜单等
  5. Windows专用库。wgl前缀。

函数命名规律

一般函数遵循 <库前缀><命令><参数个数><参数类型>的规则。

一些符号常量以GL开头。

数据类型

OpenGL数据类型 内部表示法 定义为C类型 C字面值后缀
GLbyte 8位整数 signed char b
GLshort 16位整数 short s
GLint,GLsizei 32位整数 long l
GLfloat,GLclampf 32位浮点数 float f
GLdouble,GLclampd 64位浮点数 double d
GLubyte,GLboolean 8位无符号整数 unsigned char ub
GLshort 16位无符号整数 unsigned short us
GLuint,GLenum,GLbitfield 32位无符号整数 unsigned long ui

一个完整的OpenGL程序

OpenG开发环境的搭建可以参考

VS2013 Express配置OpenGL

下面介绍的是一个画矩形的程序。

1. 头文件

OpenGL没有包含窗口系统,因此要在头文件中引入。如果在windows下,可以引入

C

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

1

2

3

#include <windows.h>

#include <gl/gl.h>

#include <gl/glu.h>

而如果使用GLUT进行窗口管理,可以直接包含glut.h ,glut.h保证了gl.h和glu.h被包含。

2. 窗口管理

使用GLUT首先需要初始化,并对命令行参数进行处理。

glutInit(&argc, argv);

接着就可以创建窗口了,但是在创建窗口之前还要设置一些窗口的样式

C

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //指定单缓存 使用RGB颜色模型
glutInitWindowSize(400, 300); //窗口大小
glutInitWindowPosition(100, 120); //窗口起始位置 左上角为0,0

1

2

3

glutInitDisplayMode(GLUT_SINGLE
| GLUT_RGB);
//指定单缓存 使用RGB颜色模型

glutInitWindowSize(400,
300);
//窗口大小

glutInitWindowPosition(100,
120);
//窗口起始位置 左上角为0,0

窗口大小和位置不设置的话就是默认设置

设定样式后可以创建窗口了

glutCreateWindow(“My first OpenGL demo”);

该函数的参数是窗口的标题。

创建窗口后,需要指定窗口要显示的内容了。通常把要显示的内容写到一个显示回调函数中。

glutDisplayFunc(Display);

Display函数就是当前窗口显示内容的函数。在每次屏幕刷新,窗口重绘时,都会调用Display函数。

这时候还需要最后一步了,调用函数glutMainLoop(); 让窗口运行起来,让回调函数进行工作。

3. OpenGL绘图

绘图之前可以先初始化窗口的一些设置。

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

指定窗口背景色为白色。四个参数分别为红 绿 蓝 和Alpha成分(透明)。由于本次程序没有混合,所以使用不透明。

设置背景色后,可以使用函数glClear(GL_COLOR_BUFFER_BIT);将背景色应用到窗口。

类似的还可以使用glColor设置图形绘制颜色。

因为OpenGL对图形的处理都是以三维方式进行,所以需要设置投影到二维

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0, 200.0, 0.0, 150.0);

这两个函数使用正投影将横坐标0-200 纵坐标0-150内的区域投影到窗口。

然后就可以绘制矩形了

glRectf(50.0f, 100.0f, 150.0f, 50.0f);

绘制一个左上角50,100 右下角150 50的矩形。

最后在回调函数中,需要用glFlush();函数清空命令缓存,强制执行命令缓存区的所有命令、

我们一般习惯把一些只进行一次的函数写到一个初始化函数中,而把绘图函数写进去回调函数中。

完整的源代码

C

#include <gl/glut.h>

void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
glRectf(50.0f, 100.0f, 150.0f, 50.0f);
glFlush();
}

int main(int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 300);
glutInitWindowPosition(100, 120);
glutCreateWindow("My first OpenGL demo");
glutDisplayFunc(Display);
Initial();
glutMainLoop();

return 0;
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include <gl/glut.h>

void
Initial(void)

{

glClearColor(1.0f,
1.0f,
1.0f,
1.0f);

glMatrixMode(GL_PROJECTION);

gluOrtho2D(0.0,
200.0,
0.0,
150.0);

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f,
0.0f,
0.0f);

glRectf(50.0f,
100.0f,
150.0f,
50.0f);

glFlush();

}

int main(int
argc,
char *
argv[])

{

glutInit(&argc,
argv);

glutInitDisplayMode(GLUT_SINGLE
| GLUT_RGB);

glutInitWindowSize(400,
300);

glutInitWindowPosition(100,
120);

glutCreateWindow("My first OpenGL demo");

glutDisplayFunc(Display);

Initial();

glutMainLoop();

return
0;

}

测试程序运行正常

如果你的笔记本不显示图形,可能是因为双显卡的问题,可以参考

OpenGL画矩形不显示矩形 显示不出来

时间: 2024-12-19 02:52:18

OpenGL入门和示例程序的相关文章

JavaCV入门之示例程序

最近因项目需要用到JavaCV,所以本小白在项目正式开始之前先学习了一下JavaCV,记录一下学习过程.附上第一个入门程序: 1.JavaCV简介 JavaCV 是一款开源的视觉处理库,使用它可以采集视频和音频,给这些音视频编解码,然后是用指定格式封装这些音视频数据,以及用什么协议传输 GitHub: https://github.com/bytedeco/javacv 2.maven引入jar包 <dependency> <groupId>org.bytedeco</gro

Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)

Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例,绘制一个三角形和正方形.尽管功能简单,可是我捣腾了好几个晚上,大量网上文章上的代码都有点问题,不是绘制不出来就是挂了. 第一个文件:MainActivity.java package com.example.learnopengl1; import android.opengl.GLSurface

python入门示例程序

该实例是raspi和dsp电机运动控制板的串口uart通信: import serial class SerialHandler(): ''' raspi serial for communication ''' def __init__(self)://初始化一些默认参数,其它非初始化参数在方法中作为参数传入 self.serialdev = None//给参数赋初始值 def serial_open(self,serialdev,timeout)://用户可传入的参数,其它参数(如baudr

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

转:openGL入门(1)

                    OpenGL入门教程 第一课: 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函

Android cocos2dx游戏开发——示例程序HelloCpp源码分析

本文通过分析cocos2dx提供的示例程序HelloCpp来分析cocos2dx的启动过程. 我们从HelloCpp.java开始: [java] view plaincopyprint? package org.cocos2dx.hellocpp; import org.cocos2dx.lib.Cocos2dxActivity; import android.os.Bundle; public class HelloCpp extends Cocos2dxActivity{ protecte

OpenGl入门——视口及物体移动函数

大学的时候有个选修课,要用OpenGl,很初级的内容,同样入门的学弟学妹适用 推荐个学习的资料NeHe的OpenGl教程,很完整而且有示例,讲的很明白.比某些破书好. 可以配合那本所谓的“红宝书”看看,中国人写的书就不要看了,我借过好几本内容都有些错误. 入门足够了 英文:http://nehe.gamedev.net/ 中文:http://www.yakergong.net/nehe/ 开始正题: glTranslatef(x,y,z);平移物体 glRotatef(角度,x,y,z);围绕制

Windows Communication Foundation (WCF)和Windows CardSpace的示例程序

微软公司昨天发布了一个Windows Communication Foundation (WCF)和Windows CardSpace的示例程序包,内容极为丰富,从最简单的Hello World到复杂的解决方案一应俱全.对于Windows Communication Foundation (WCF)和Windows CardSpace这两个新东西而言,这些示例程序无疑就是最好的学习资源. 下载地址:http://www.microsoft.com/downloads/details.aspx?F

OpenGL 入门教程3

点的大小默认为 1 个像素,但也可以改变之.改变的命令为 glPointSize,其函数原型如下: void glPointSize(GLfloat size); size 必须大于 0.0f,默认值为 1.0f,单位为"像素". 注意:对于具体的 OpenGL 实现,点的大小都有个限度的,如果设置的 size 超过最大值,则设置可能会有 问题. 例子 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(5.