文档章节

小菜学Chromium之OpenGL学习之二

yang_danny
 yang_danny
发布于 2015/04/17 22:31
字数 1648
阅读 25
收藏 0

在这个教程里,我们一起来玩第一个OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架.
在CodeBlock里创建一个新的GLUT Win32程序(不是console控制台程序)后,我们还需要链接OpenGL库文件。
代码的前4行包括了我们使用的每个库文件的头文件。如下所示:

#include <windows.h> // Windows的头文件
#include <glew.h>       // 包含最新的gl.h,glu.h库
#include <glut.h> // 包含OpenGL实用库
接下来需要设置使用的所有变量。本节中的例程将创建一个空的OpenGL窗口,因此我们暂时还无需设置大堆的变量。余下需要设置的变量不多,但十分重要。几乎所写的每一个OpenGL程序中都会用到它们。
第一行设置的变量是Rendering Context(着色描述表)。每一个OpenGL都被连接到一个着色描述表上。着色描述表将所有的OpenGL调用命令连接到Device Context(设备描述表)上。我将OpenGL的着色描述表定义为 hRC 。要让程序能够绘制窗口的话,还需要创建一个设备描述表,也就是第二行的内容。Windows的设备描述表被定义为 hDC 。DC将窗口连接到GDI(Graphics Device Interface图形设备接口)。而RC将OpenGL连接到DC。第三行的变量 hWnd 将保存由Windows给我们的窗口指派的句柄。最后,第四行为我们的程序创建了一个Instance(实例)。
HGLRC           hRC=NULL;// 窗口着色描述表句柄
HDC             hDC=NULL;// OpenGL渲染描述表句柄
HWND            hWnd=NULL;// 保存我们的窗口句柄
HINSTANCE       hInstance;// 保存程序的实例
bool keys[256];// 保存键盘按键的数组
bool active=TRUE;// 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE;// 全屏标志缺省,缺省设定成全屏模式
下面的代码的作用是重新设置OpenGL场景的大小,而不管窗口的大小是否已经改变(假定您没有使用全屏模式)。OpenGL场景的尺寸将被设置成它显示时所在窗口的大小。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height){
if (height==0) // 防止被零除
{
height=1;// 将Height设为1
}
glViewport(0, 0, width, height);// 重置当前的视口
glMatrixMode(GL_PROJECTION);// 选择投影矩阵
glLoadIdentity();// 重置投影矩阵
// 设置视口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);// 选择模型观察矩阵
glLoadIdentity();// 重置模型观察矩阵}
接下的代码段中,我们将对OpenGL进行所有的设置。我们将设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading(阴影平滑),等等。
int InitGL(GLvoid)// 此处开始对OpenGL进行所有设置{
glShadeModel(GL_SMOOTH);// 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正
return TRUE; // 初始化 OK
}
下一段包括了所有的绘图代码。任何所想在屏幕上显示的东东都将在此段代码中出现。
int DrawGLScene(GLvoid)// 从这里开始进行所有的绘制
{ // 清除屏幕和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); // 重置当前的模型观察矩阵
return TRUE; //  一切 OK
}
下面是我们的Windows程序的入口。将会调用窗口创建例程,处理窗口消息,并监视人机交互。
int WINAPI WinMain(HINSTANCE hInstance,// 当前窗口实例
HINSTANCE hPrevInstance,// 前一个窗口实例
LPSTR lpCmdLine,// 命令行参数
int nCmdShow) // 窗口显示状态
{
创建OpenGL窗口
if (!CreateGLWindow("OpenGL程序框架",640,480,16,fullscreen))
{
return 0; // 失败退出
}
下面是循环的开始。只要done保持FALSE,循环一直进行。
      保持循环直到 done=TRUE
while(!done)
{
我们要做的第一件事是检查是否有消息在等待。使用PeekMessage()可以在不锁住我们的程序的前提下对消息进行检查。许多程序使用GetMessage(),也可以很好的工作。但使用GetMessage(),程序在收到paint消息或其他别的什么窗口消息之前不会做任何事。
       //有消息在等待吗?
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
下面的代码查看是否出现退出消息。如果当前的消息是由PostQuitMessage(0)引起的WM_QUIT,done变量被设为TRUE,程序将退出。
               // 收到退出消息?
if (msg.message==WM_QUIT)
{
done=TRUE; // 是,则done=TRUE
}
else
{
               // 不是,处理窗口消息
如果不是退出消息,我们翻译消息,然后发送消息,使得WndProc() 或 Windows能够处理他们。
TranslateMessage(&msg); // 翻译消息
DispatchMessage(&msg); // 发送消息
}
}
else // 如果没有消息
{
如果没有消息,绘制我们的OpenGL场景。代码的第一行查看窗口是否激活。如果按下ESC键,done变量被设为TRUE,程序将会退出。
// 绘制场景。监视ESC键和来自DrawGLScene()的退出消息
if (active) // 程序激活的么?
{
if (keys[VK_ESCAPE]) // ESC 按下了么?
{
done=TRUE; // ESC 发出退出信号
}
else // 不是退出的时候,刷新屏幕
{
如果程序是激活的且ESC没有按下,我们绘制场景并交换缓存(使用双缓存可以实现无闪烁的动画)。我们实际上在另一个看不见的"屏幕"上绘图。当我们交换缓存后,我们当前的屏幕被隐藏,现在看到的是刚才看不到的屏幕。这也是我们看不到场景绘制过程的原因。场景只是即时显示。
            DrawGLScene(); // 绘制场景
SwapBuffers(hDC); // 交换缓存 (双缓存)
}
}
}
如果done变量不再是FALSE,程序退出。正常销毁OpenGL窗口,将所有的内存释放,退出程序。
// 关闭程序
KillGLWindow(); // 销毁窗口
return (msg.wParam); // 退出程序
}
在这一课中,详细解释了所有的基本步骤。每一步都与设置有关,并创建了一个全屏OpenGL程序。这是框架,几乎每个OpenGL程序都会用到这些步骤。

欢迎大家继续关注更多内容

身为一名IT技术人员磨练自己的技术是必不可少的,关注微信号coder_online,程序员互动联盟,可以与大牛在线随时讨论自己感兴趣的话题,让自己用最少的时间学到最多的东西,扫一扫下方二维码或者搜索微信号coder_online即可关注。

                                       

参考资料:nehe的OpenGL教程http://www.yakergong.net/nehe/

本文转载自:

yang_danny
粉丝 18
博文 23
码字总数 26453
作品 0
丰台
私信 提问
小菜鸟带着梦想学chromium

风雨送春归, 飞雪迎春到。 已是悬崖百丈冰, 犹有花枝俏。 俏也不争春, 只把春来报。 待到山花烂漫时, 她在丛中笑。 这首《毛泽东诗词》·卜算子·咏梅可是应了我的心情了。最近换工作,受...

yang_danny
2015/04/06
247
3
【转载】OpenGL C#绘图环境配置

OpenGL简介 OpenGL作为一种图形学编程接口已经非常流行, 虽然在大型游戏方面DirectX有一定的市场占有率, 但由于OpenGL的开放性,可移植性等优点,OpenGL已经成了一种图形学方面的标准。 由...

venorie
2013/06/17
714
0
2019年春季学期:学习资料汇总

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BeerBread134/article/details/88086608 算法设计与分析 数字图像处理 教材 冈萨雷斯-数字图像处理(MATLAB版...

陶晨毅
03/03
0
0
定了,2018年将是微信小游戏的WebGL元年,张师傅带你零基础上车 - 知乎

2017 年的最后一个工作日,微信带来了一个深水炸弹——小游戏。我们看下首批发布的 15 款小游戏,它们用了 cocos、laya、phaser 和 three.js 等 WebGL 引擎。 1 欢乐斗地主 cocos 2 四川麻将...

黑客与画家
昨天
0
0
OpenGL 及 OpenCL 的进展

近期 OpenGL 有了新的发展,NVIDIA 发布了正式支持 OpenGL 3.0 规范的 180.27 驱动(8 系列及之后系列硬件支持 OpenGL 3.0),ATI 方面则发布了 Catalyst 9.1, 亦提供了 OpenGL 3.0 的支持(...

红薯
2009/02/05
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
22分钟前
14
0
读书笔记:深入理解ES6 (八)

第八章 迭代器(Iterator)与生成器(Generator) 第1节 循环语句的问题   在循环、多重循环中,通过变量来跟踪数组索引的行为容易导致程序出错。迭代器的出现旨在消除这种复杂性,并减少循...

张森ZS
23分钟前
12
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
27分钟前
13
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
36分钟前
12
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM...

阿里云官方博客
38分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部