首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

Linux系统上的OpenGL图形程序框架

2013-01-22 
Linux系统下的OpenGL图形程序框架Linux系统下的OpenGL图形程序框架说到图形界面编程,想到的大多是Windows

Linux系统下的OpenGL图形程序框架

            Linux系统下的OpenGL图形程序框架

        说到图形界面编程,想到的大多是Windows下的多种多样的应用程序。Linux是一个基于命令行的操作系统,在Linux下的工作大多是在命令行里完成的,而并非像Windows那样。图形界面虽然并不是Linux的一部分,我们通过一些工具,依然可以编写一些在Linux下的图形应用程序。

        OpenGL是一个工业标准的三维计算机图形软件接口,它由SGI公司发布并广泛应用于Unix、OS/2、Windows/NT等多种平台,这其中当然也包括Linux。

        X11也叫做X Window系统,X Window系统 (X11或X)是一种位图显示的 视窗系统 。它是在 Unix 和 类Unix操作系统,以及 OpenVMS 上建立图形用户界面的标准工具包和协议。Linux就是一个类Unix的操作系统。

        有了这两个工具,我们便能在Linux下进行图形界面编程了。

1.创建窗口

             由于X Window系统的协议和架构 X基于 客户端-服务器 模型,首先创建一个连接,连接到X服务器。

2.OpenGL初始化        编写一个glfInit()函数用来进行对OpenGL的初始化,如:调整投影变换,设置视口,etc.这个函数定义在glFrame.h中。        

        可以注意到,所有和OpenGL相关的编码,都被放到了glfFrame.h中,于是我们的工作只需要修改glfFrame里面的内容就能够自由的进行绘制工作,并且响应鼠标键盘事件。        为了能够实现更多的功能,我为这个框架实现了按钮和标签。在font.h,定义了26个英文大写字母的位图矩形数组。使用glBitmap函数以及显示列表机制使我们能够很方便地使用光栅字体。        打印字母的具体做法:

        本文的全部代码以及上传到了Great-Code上,请猛击此处。附glFrame.h代码:
#ifndef GLFRAME_H_INCLUDED#define GLFRAME_H_INCLUDED#include "global.h"#include "font.h"#include "Label.h"#include "Button.h"void glfPrint(GLboolean doubleBuffer);void glfInit();void glfProcessKeyboard(KeySym keysym);void glfProcessMouseClick(int x,int y);void glfprocessButtonPress();void glfUpdate();void glfReshape(int width,int height);void glfDraw();Label label;Button button;Button b_exit;void glfPrint(GLboolean doubleBuffer){    if (doubleBuffer)        glXSwapBuffers(dpy, win);    else        glFlush();}void glfInit(){    glViewport(0, 0, glf_WinWidth, glf_WinHeight);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    glf_left=0.0f;    glf_right=50.0f;    glf_bottom=0.0f;    glf_top=50.0f;    glf_near=-1.0f;    glf_far=1.0f;    glOrtho(glf_left,glf_right,glf_bottom,glf_top,glf_near,glf_far);    glMatrixMode(GL_MODELVIEW);    makeRasterFont();    label.isShow=GL_TRUE;    label.color[0]=1.0f;    label.color[1]=1.0f;    label.color[2]=0.0f;    label.color[3]=0.0f;    label.posx=15;    label.posy=40;    strcpy(label.str,"HELLO SSSOGS");    button.isShow=GL_TRUE;    button.isAround=GL_TRUE;    button.aroundLineWidth=3;    button.aroundColor[0]=0.0f;    button.aroundColor[1]=1.0f;    button.aroundColor[2]=0.0f;    button.aroundColor[3]=0.0f;    button.leftDown.p[0]=4;    button.leftDown.p[1]=20;    button.leftUp.p[0]=4;    button.leftUp.p[1]=30;    button.rightDown.p[0]=24;    button.rightDown.p[1]=20;    button.rightUp.p[0]=24;    button.rightUp.p[1]=30;    button.color[0]=0.9f;    button.color[1]=0.5f;    button.color[2]=0.9f;    button.color[3]=0.0f;    button.text.isShow=GL_TRUE;    button.text.color[0]=0.0f;    button.text.color[1]=0.0f;    button.text.color[2]=0.0f;    button.text.color[3]=0.0f;    button.text.posx=6;    button.text.posy=25;    strcpy(button.text.str,"HIDE WORDS");    strcpy(button.event,"Test");    b_exit.isShow=GL_TRUE;    b_exit.isAround=GL_TRUE;    b_exit.aroundLineWidth=3;    b_exit.aroundColor[0]=0.0f;    b_exit.aroundColor[1]=1.0f;    b_exit.aroundColor[2]=0.0f;    b_exit.aroundColor[3]=0.0f;    b_exit.leftDown.p[0]=26;    b_exit.leftDown.p[1]=20;    b_exit.leftUp.p[0]=26;    b_exit.leftUp.p[1]=30;    b_exit.rightDown.p[0]=46;    b_exit.rightDown.p[1]=20;    b_exit.rightUp.p[0]=46;    b_exit.rightUp.p[1]=30;    b_exit.color[0]=0.9f;    b_exit.color[1]=0.5f;    b_exit.color[2]=0.9f;    b_exit.color[3]=0.0f;    b_exit.text.isShow=GL_TRUE;    b_exit.text.color[0]=0.0f;    b_exit.text.color[1]=0.0f;    b_exit.text.color[2]=0.0f;    b_exit.text.color[3]=0.0f;    b_exit.text.posx=28;    b_exit.text.posy=25;    strcpy(b_exit.text.str,"EXIT");    strcpy(b_exit.event,"exit");}void glfProcessKeyboard(KeySym keysym){    if (keysym == (KeySym)XK_Escape)        exit(0);}void glfProcessMousePress(int x,int y){    if (glfCheckButtonPress(x,y,button) == GL_TRUE)    {        glfprocessButtonPress();    }    if (glfCheckButtonPress(x,y,b_exit) == GL_TRUE)    {        glfprocessButtonPress();    }}void glfprocessButtonPress(){    if (glf_buttonevent == NULL)        return ;    if (strcmp(glf_buttonevent,"Test") == 0)    {        label.isShow=!label.isShow;        if (label.isShow)        {            strcpy(button.text.str,"HIDE WORDS");        }        else        {            strcpy(button.text.str,"SHOW WORDS");        }    }    if (strcmp(glf_buttonevent,"exit") == 0)    {        exit(0);    }}void glfUpdate(){}void glfReshape(int width,int height){    glf_WinWidth=width;    glf_WinHeight=height;    glViewport(0,0,glf_WinWidth,glf_WinHeight);}void glfDraw(){    glClearColor(0.0,0.0,0.0,0.0);    glClear(GL_COLOR_BUFFER_BIT);    glfDrawLabel(label);    glfDrawButton(button);    glfDrawButton(b_exit);    glfPrint(glf_DoubleBuffer);}#endif // GLFRAME_H_INCLUDED



热点排行