在这个教程里,我们一起来玩第一个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/
相关推荐
### Chromium中的智能指针实现分析 #### 一、引言 在C++编程语言中,内存管理是一项重要的任务。为了防止资源泄露或悬挂指针等问题的发生,开发者们常常需要手动管理对象的创建与销毁。然而,这样的做法不仅繁琐...
**正文** Chromium Embedded Framework(CEF)教程 CEF是一个开源框架,它允许开发人员将Chromium...然而,这只是CEF学习的一部分,深入研究CEF的高级通信技术,如Message传递,将进一步增强你的应用功能和用户体验。
Chromium的Media模块是其浏览器核心组件之一,主要负责音频和视频的处理、解码以及播放功能。这个模块对于理解现代Web浏览器如何处理多媒体内容至关重要。在这里,我们将深入探讨Chromium Media模块的关键知识点,...
二、OpenGL支持 Chromium源码还包含对OpenGL的支持,这是一个跨平台的图形库,用于生成2D和3D图像。OpenGL程序可以直接在Chromium的并行绘制系统上运行,这意味着开发者无需进行大规模修改,即可利用Chromium的硬件...
通过研究Android Chromium源码,开发者不仅可以提升对Android系统和浏览器原理的理解,还能学到如何构建大型、复杂应用的实践经验。这是一个宝贵的教育资源,对于想要在Android开发领域深化技能的人来说,绝对值得...
总的来说,"chromium-linux.zip" 提供了一个深入了解和参与浏览器开发的机会,对于 Linux 开发者来说,这是一份宝贵的资源,可以学习到现代浏览器的工作原理,以及如何在 Linux 环境下进行高性能的软件开发。...
众所周知, chromium 是多进程框架的,整个 chromium 浏览器包括四类进程: browse 主进程、 render 渲染进程、 GPU 进程和插件进程。本文所要讲述的 chromium 事件处理流程 主要牵涉到其中的两种进程: browser ...
2. **chromium-browser-l10n_56.0.2924.76-0ubuntu0.16.10.1335_all.deb**:此包提供了Chromium浏览器的本地化资源,包括各种语言的界面文本。"all"表示这个包适用于所有架构,意味着无论你的树莓派运行哪种Linux...
Chromium是一款开源的浏览器项目,它是Google Chrome浏览器的基础。在使用Chromium或Chrome时,可以通过命令行参数来调整浏览器的行为,进行调试或者实验新的功能。本文将详细介绍一些Chromium的命令行开关及其作用...
这个OpenGL Demo是学习离屏渲染的良好起点,它可以帮助初学者理解如何创建和使用FBO,以及如何在离屏和屏幕之间切换渲染目标。通过实践和调试,你可以更深入地了解OpenGL的渲染管线和状态管理,这对进一步学习高级...
2. **Chromium博客**: 阅读关于Chromium的新特性、更新和最佳实践的文章。 3. **Android开发者文档**: 学习如何将Chromium集成到Android应用中,以及Android特有的API和工具。 总的来说,Chromium for Android是为...
Chromium浏览器是一款开源的网页浏览器项目,它是Google Chrome浏览器的基础,两者在许多方面都有相似之处,但Chromium更侧重于开发者社区的贡献和对新功能的快速迭代。这个压缩包文件"chrome-win32"表明它包含的是...
ungoogled-chromium是Google Chromium,不依赖于Google Web服务。 ungoogled-chromium尽可能保留默认的Chromium体验。与其他具有Web浏览器愿景的其他Chromium分支不同,ungoogled-chromium本质上是Chromium的直接...
在这篇文章中,我们学习了如何在树莓派中安装 Chromium 浏览器并配置 Flash 插件。我们还学习了如何删除树莓派自带的浏览器 Epiphany 浏览器。这些步骤将帮助您在树莓派中安装和配置 Chromium 浏览器,并支持 Flash ...
该文件属于Chromium 58版本的编译配置文档,其中,包含每一项参数的说明。 请注意,该文档是通过gn args --list out/debug生成的,如果你已下载Chromium源码,可以手动生成,不必下载。
2. **自动化更新**:Chromium Nightly Updater 1.1自动检测并安装最新的夜间构建,节省了用户手动查找和下载的时间,同时也确保了用户始终使用的是最新版本的Chromium。 3. **配置文件(cnu.ini)**:此类文件用于...
使用 Chromium 嵌入式框架 (CEF) 的 OpenGL GUI 实现。去做更好地处理调整窗口大小将鼠标和键盘事件发送到浏览器实现javascript回调笔记libcef.so 超出了 Github 的文件大小限制,因此未包含在 repo 中。 当前使用 ...
Chromium图形栈在2014年有多项改进,在图形性能和资源消耗方面做了...这个幻灯片尝试列举Chromium在图形栈方面一些变化,以及Chromium渲染流水线的总体框架,并对WebGL性能慢于OpenGL原生应用的原因做了一定的推测。
SwitchyOmega-Chromium
chromium离线安装版49 x86 32位windows xp 2003 亲测好用.chromium 不会默认上传您的用户数据,且性能比同版本chrome强10%。差不多可以说算得上是xp 2003 下最好用的 浏览器了