当前位置 : 主页 > 网络编程 > 其它编程 >

OpenGL入门和示例程序

来源:互联网 收集:自由互联 发布时间:2023-07-02
大家好,今天雅乐网给大家介绍一下OpenGL的一些基本语法和一个简单的示例程序。OpenGL是什么呢?说简单一点,就是一个图形软件包,它提供了许多函数供我们调用。我们看看维基百 大
大家好,今天雅乐网给大家介绍一下OpenGL的一些基本语法和一个简单的示例程序。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主要由以下几个函数库组成。

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

    一般函数遵循 的规则。

    一些符号常量以GL开头。

    数据类型

    OpenGL数据类型内部表示法定义为C类型C字面值后缀GLbyte8位整数signed charbGLshort16位整数shortsGLint,GLsizei32位整数longlGLfloat,GLclampf32位浮点数floatfGLdouble,GLclampd64位浮点数doubledGLubyte,GLboolean8位无符号整数unsigned charubGLshort16位无符号整数unsigned shortusGLuint,GLenum,GLbitfield32位无符号整数unsigned longui

    一个完整的OpenGL程序

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

    VS2013 Express配置OpenGL

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

    1. 头文件

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

    C#include #include #include 123#include #include #include

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

    2. 窗口管理

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

    glutInit(

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

    CglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //指定单缓存 使用RGB颜色模型glutInitWindowSize(400, 300); //窗口大小glutInitWindowPosition(100, 120); //窗口起始位置 左上角为0,0123glutInitDisplayMode(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 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(glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400, 300);glutInitWindowPosition(100, 120);glutCreateWindow("My first OpenGL demo");glutDisplayFunc(Display);Initial();glutMainLoop();return 0;}123456789101112131415161718192021222324252627282930#include  voidInitial(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(intargc,char *argv[]){glutInit(glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow("My first OpenGL demo");glutDisplayFunc(Display);Initial();glutMainLoop();return0;}

    测试程序运行正常

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

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

    技术分享

    OpenGL入门和示例程序

    网友评论