`
yistn
  • 浏览: 7381 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

小菜学Chromium之OpenGL学习之二

 
阅读更多


在这个教程里,我们一起来玩第一个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;// 保存程序的实例

boolkeys[256];// 保存键盘按键的数组

boolactive=TRUE;// 窗口的活动标志,缺省为TRUE

boolfullscreen=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(HINSTANCEhInstance,// 当前窗口实例

HINSTANCEhPrevInstance,// 前一个窗口实例

LPSTRlpCmdLine,// 命令行参数

intnCmdShow)// 窗口显示状态

{

创建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/

分享到:
评论

相关推荐

    基于springboot+vue的的公交线路查询系统(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    单片机仿真proteus实例

    单片机仿真在电子工程和计算机科学领域中扮演着重要的角色,它允许开发者在实际硬件构建之前测试和验证他们的设计。Proteus是一款强大的单片机仿真软件,它结合了电路设计、模拟仿真和编程调试等多种功能,为单片机项目开发提供了便捷的平台。在这个“单片机仿真Proteus实例4X4键盘”的教程中,我们将深入探讨如何使用Proteus进行4X4矩阵键盘的仿真。 4X4键盘是一种常见的输入设备,常用于嵌入式系统和小型电子设备中。它由4行4列共16个按键组成,通过矩阵扫描方式实现键值的识别。在Proteus中模拟4X4键盘,首先需要搭建硬件电路模型。这包括连接按键到单片机的输入引脚,通常使用I/O口来读取按键状态。每个按键对应一个行线和一个列线,当按键按下时,行线和列线将短路,单片机通过检测这些短路来确定哪个键被按下。 在Proteus中,我们可以通过库搜索并添加所需的元器件,如74HC138译码器(用于驱动列线)和74HC238译码器(用于驱动行线),以及单片机(如AT89C51或类似的微控制器)和。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    花生好坏缺陷识别数据集,7262张图片,支持yolov7格式的标注,识别准确率在95.7%

    花生好坏缺陷识别数据集,7262张图片,支持yolov7格式的标注,识别准确率在95.7% 两种标签: Good,Bad 花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7% 详情查看地址:https://backend.blog.csdn.net/article/details/144983881

    使用ortools排产建模

    使用ortools排产建模示例

    Prime-Series-Level-1.z04

    Prime_Series_Level-1.z04 别下,这个是分卷压缩,笔者用来备份的

    2024年 8项合集12月最新JavaGuide 面试指北 代码随想录八股文 面经 【8项全部打包】最新面试指北 + JavaGuide + 最新代码随想录八股文 + 50万字Java面试宝

    【8项合集】12月最新JavaGuide 面试指北 代码随想录八股文 面经   【8项全部打包】 【最新面试指北 + JavaGuide + 最新代码随想录八股文 + 50万字Java面试宝典 + Java高频面试题199解答 + Java一站式搞定技术项目面 + 大厂核心体系题 + 24大厂面试题第4季】 1. Java面试指北  2024 12月最新版   2. JavaGuide面试大全   3. 代码随想录最强八股文(第5版)最新合集 4. 2024大厂面试题(第4季) 5. 2024 Java面试宝典合集 6. 2024 Java高频面试题199个 7.  2024 一站式搞定Java技术和项目面试 8.  Java大厂面试核心体系题

    基于springboot+vue的科研工作量管理系统的设计与实现(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    基于springboot+vue的城镇保障性住房管理系统(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    vue.min.js下载

    vue.min.js下载

    docker的概要介绍与分析

    Docker是一个开源的应用容器引擎,它通过操作系统级的虚拟化技术(如Linux上的命名空间和控制组)来创建和管理轻量级的、可移植的软件容器。这些容器能够在不同的主机之间无缝运行,并且具备一致的行为,因为它们包含了应用运行所需的所有依赖库、配置文件和服务。 Docker的主要资源包括Docker镜像、Docker容器和Docker仓库。Docker镜像是静态的、只读的模板,包含了运行一个应用程序所需的所有内容。Docker容器则是基于Docker镜像创建的一个轻量级、独立的运行环境,是Docker技术的核心运行时实体。Docker仓库则用于存储和分发Docker镜像,有公共和私有两种形式。 关于Docker的项目源码,通常镜像本身并不直接包含源码,因为镜像主要用于打包和运行应用程序及其依赖项。然而,如果你需要查看某个运行在Docker容器中的应用程序的源码,有几种方法可以实现。一种方法是通过容器挂载本地目录,将项目的源码文件映射到容器内。另一种方法是使用docker exec命令进入运行中的容器,然后在容器内查找并查看源码。通常,项目的源码会存放在特定的目录中,你可以通过查找Doc

    煤层气开采热力流(thm)耦合案列讲解

    煤层气开采热力流(thm)耦合案列讲解

    车载数据结构领域:ARXML vs JSON的技术比较及其在AUTOSAR中的应用

    内容概要:本文由一位汽车电子工程师撰写,主要探讨了两种常见数据格式——ARXML和JSON的区别及各自特点,并详细解释了为何在 AUTOSAR 标准中选用 ARXML而非JSON。首先阐述了 JSON 与 XML 的优缺点,并对比两者的应用场景,尤其针对Web环境以及复杂的文档描述和企业应用服务。接着深入讨论了 AUTOSAR 使用 ARXML 文件的关键理由:强大的复杂数据结构表达、严格的验证约束、与现有工具链的良好兼容性、高度扩展性的特性以及标准化和支持大型项目的性能。最后强调对于车载软件工程师来说,熟悉这两类文件是非常重要的,同时也提供了进一步学习 JSON 和 XML 的参考资料。 适用人群:面向汽车行业软件工程从业人员,特别是负责 AUTOSAR 系统设计与实现的研发工程师和技术爱好者。 使用场景及目标:有助于读者理解为什么在汽车行业中选择了 ARXML 而非 JSON 来承载 AUTOSAR 接口交互任务。同时帮助开发者掌握不同环境下选择恰当数据格式的基本原则。 其他说明:作者是一名有着丰富实践经验的汽车电子工程师,文中不仅涉及到技术细节的分析,还包括个人从业体会的心得感悟,表达了对未来技术发展的期待和个人信念。

    基于STM32开发变频器-企业级成熟量产方案 包含:变频控制板-原理图、PCB 变频逆变器功率板-原理图 PCB 控制板源代码+硬件设计说明书+软件设计说明书 变频逆变器功率板 硬件设计说明书+总体

    基于STM32开发变频器-企业级成熟量产方案 包含:变频控制板-原理图、PCB 变频逆变器功率板-原理图 PCB 控制板源代码+硬件设计说明书+软件设计说明书。 变频逆变器功率板 硬件设计说明书+总体设计说明书+辅助电源变压器 额定输入电压:DC110V 输入电压范围:DC77-137.5V 电压:200V±5%(200VAC~240VAC可调) 频率: 42Hz±0.5Hz(35-50可调) 额定输出容量:1.3kW 1.55kVA 工作温度:-25℃~+70℃ 相对湿度:≤100%(不结露) 海拔:≤2500m 输出电压波形:正弦波

    Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)

    Java基于springboot+vue的电影院管理系统源码+数据库(高分项目),个人大三大作业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码

    永磁同步电机双矢量占空比模型预测转矩控制mptc,考虑全局最优占空比选择,使得全局占空比基本都小于1,仿真波形效果不错,有word文档解析

    永磁同步电机双矢量占空比模型预测转矩控制mptc,考虑全局最优占空比选择,使得全局占空比基本都小于1,仿真波形效果不错,有word文档解析。

    基于springboot+vue的的二手车交易系统的设计与实现(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    大数据lzo压缩库,jar包格式

    大数据lzo压缩库,jar包格式

    android 天气app开发

    :Android 天气应用开发 在Android平台上,创建一个天气应用程序是一个常见的学习项目,也是期末大作业的理想选择,因为它涵盖了多个关键的技术点,包括网络请求、数据解析、UI设计以及地理位置服务等。本项目旨在帮助学生深入理解Android应用开发流程,提升实战技能。 :Android期末大作业必备 这个项目适合作为Android开发课程的期末大作业,因为它要求开发者具备一定的基础,例如对Android Studio的使用、XML布局设计、Java或Kotlin编程语言的掌握,以及对Android SDK的理解。通过完成这个项目,学生可以巩固课堂所学,同时提高独立解决问题的能力。 :Android Android是Google主导的开源移动操作系统,广泛应用于智能手机和平板电脑。开发Android应用需要使用Android Studio IDE,学习Android SDK,理解Android组件(如Activity、Intent、Service等),以及掌握XML和Java/Kot。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    音视频相关的OpenCV库,嵌入式Linux,ARM32平台,已使用32位arm-linux-gnueabihf编译链进行编译,可直接使用

    音视频相关的OPENCV库,嵌入式Linux,ARM32平台,已使用32位arm-linux-gnueabihf编译链进行编译,可直接使用; 包含include/lib/bin等文件夹,内含动静态库,头文件,ffmpeg或ffplay命令等

    COMSOL超声无损tfm,saft,全聚焦,合成孔径模型,单模型 模型介绍:本链接有两个模型,分别使用压力声学与固体力学进行仿真,副有模型说明 使用者可自定义阵元数、激发频率、接收阵元等参数,仿真

    COMSOL超声无损tfm,saft,全聚焦,合成孔径模型,单模型 模型介绍:本链接有两个模型,分别使用压力声学与固体力学进行仿真,副有模型说明。 使用者可自定义阵元数、激发频率、接收阵元等参数,仿真过程不用切激发阵元,一键激发,一次性接收信号 为什么要做两个模型,固体力学会产生波形转,波形交乱,压力声学波速是恒定(一般为纵波),两种波形成像效果不一样,可以做对比。 版本为6.0,低于6.0的版本打不开此模型

Global site tag (gtag.js) - Google Analytics