opengl 创建窗口

opengl 创建窗口

本章教程内容主要来自:http://ogldev.atspace.co.uk/www/tutorial01/tutorial01.html

使用OpenGL之前,请先安装和设置好FreeGlut和glew, 下载地址:

http://freeglut.sourceforge.net/

http://glew.sourceforge.net/

原教程源码下载地址:http://ogldev.atspace.co.uk/ogldev_win.zip

OpenGL做为3D图形接口,本身并不提供任何窗口管理功能,在不同操作系统中,通常都有相关库做为OpenGL和os的接口,来实现窗口管理,比如xwindows系统中的GLX, windows系统中的WGL, MAC OS中的CGL等等。在下面的一系列教程中,我们使用glut,这是一个跨平台的库,能实现简单的窗口管理以及输入输出操作,特别是适合学习OpenGL或者做一些简单的应用。

下面我们学习一下如何用glut创建窗口:

//场景渲染函数 

static void RenderSceneCB()
    { 
    //在每帧渲染前,用指定的颜色清除color buffer ,清除颜色为glClearColor指定的颜色 
    glClear(GL_COLOR_BUFFER_BIT);

    //交换前后缓冲,把渲染内容在屏幕上显示出来 
    glutSwapBuffers(); 
    }

static void InitializeGlutCallbacks() 
    { 
    glutDisplayFunc(RenderSceneCB); 
    }

int main(int argc, char** argv) 
    {

   glut初始化函数,该函数的参数使用应用程序的命令行参数。常用的命令行参数有-sync, –gldebug等,详细参数信息请看:[http://www.opengl.org/documentation/specs/glut/spec3/node10.html](http://www.opengl.org/documentation/specs/glut/spec3/node10.html) 
    //初始化glut 
    glutInit(&argc, argv);

   GLUT_DOUBLE指定系统使用双缓冲,就是有2个color buffer,一个称作前缓冲,一个称作后缓冲,渲染输出的内容先放在后缓冲中,再通过swapbuffer,交换前后缓冲,这样做,可以防止一帧图像没有全部渲染完成,就在屏幕上显示出来。 GLUT_RGBA指定color buffer的格式。

    //使用双缓冲,color缓冲像素格式用RGBA格式 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); 
    //窗口大小及位置 
    glutInitWindowSize(800, 600); 
    glutInitWindowPosition(100, 100); 
    //窗口标题 
    glutCreateWindow("Tutorial 01");

   设置回调函数,主要是指定主窗口的回调函数。这样,当main函数进入loop后,我们便可以通过回调函数和窗口交互,这类似于windows的事件机制。

    //设置渲染的回调函数 
    InitializeGlutCallbacks();

   下面的代码用来得到渲染窗口的句柄,在opencl和opengl交互的程序中,可能用到渲染窗口句柄。注意:glutCreateWindow函数和glutGetWindow返回的并不是窗口句柄,而是一个整数,表示窗口id编号,所以要得到渲染窗口句柄,我们可以通过下面的win32函数实现,也可以修改freeglut的源代码,使glutGetWindow函数返回窗口句柄。

//得到渲染窗口的句柄 
const char *windowTitle = "This is my title"; 
glutSetWindowTitle(windowTitle); 
HWND windowHandle = FindWindow(NULL,L"This is my title"); 
HDC deviceContext = GetDC(windowHandle); 
HGLRC renderingContext = wglGetCurrentContext(); 
cout<<"render window handle:"<<windowHandle<<endl; 

  我们知道opengl的渲染状态设置好以后,除非再次设置新的状态,否则会一直保持当前状态设置,比如设置背景渲染颜色为黑色后,除非我们再次调用glClearColor设置新的颜色,否则每帧渲染前,调用glClear函数都会把color buffer设置为黑色。

   //设置清除背景颜色为黑色,像素格式RGBA ,该函数指定用来清除color buffer的背景颜色 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

  下面这个函数告诉glut开始内部循环,在循环的过程中,它会不断监听一些消息、事件,并根据这些消息事件来响应不同的回调函数。

    glutMainLoop();

    return 0; 
    }

程序执行后,会显示一个黑乎乎的窗口,啥也没有……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值