前面的例子,介绍了如何在Windows下仅使用VS或SDK自带库创建OpenGL环境的方法和例子。微软开发OpenGL的历史如此之短,之后就全力开发自己的亲儿子:DirectX。从此之后Windows平台对OpenGL的内置支持就停留在OpenGL 1.1版。当然,在Vista之后,微软甚至开发了一个OpenGL到DirectX的转换层,支持到OpenGL 1.4,这使得系统在没有安装支持OpenGL的显卡驱动时仍然能够运行一部分基于OpenGL的程序。

OpenGL并非为Windows而生,事实上在除了Windows的其它几乎所有操作系统平台上,OpenGL都扮演着更为重要的角色。

那么,在Windows平台上如何使用最新版本的OpenGL函数呢?这些函数从何而来呢?这一章主要谈论这两个问题。

2.1 访问OpenGL最新版本中的函数

在第一章提到过,与其他任何库一样,OpenGL必须有能力操作系统中的显示设备。而现代操作系统都不允许应用直接操作硬件设备,因此对硬件的操作要么需要开发硬件驱动,要么需要使用操作系统提供的操作接口。

微软已经差不多18年没有对OpenGL的支持做过重大更新了,显然windows操作系统不可能提供更多有关OpenGL的接口函数。这样,新的OpenGL函数只能通过驱动程序提供。

事实也正是如此,OpenGL提供了一组规范,但这些规范不是给应用程序人员用的,是提供给显卡开发商的,根据这组规范,显卡开发商开发的显卡驱动可以提供对OpenGL的支持。比如在我的机器上,GeForce 605的显卡驱动就提供了对OpenGL4.3.0的支持。

所有库的开发中,能够设计一个预留的“升级接口”是非常高明的,OpenGL就是如此。opengl32.dll是windows系统自带的对OpenGL驱动访问的接口库,从windows 95开始,只要装好系统它就存在。在windows 7上通过VS的dumpbin.exe查看opengl32.dll可以看到它导出了368个函数。

其中:

125  7C 00003CED glGetString

356  163 0003C245 wglGetProcAddress

这两个函数非常重要,glGetString函数在第一章中已经使用过了,利用它可以了解系统中OpenGL相关的各种信息。

wglGetProcAddress也是个非常重要的函数,通过给出OpenGL函数名,就可以利用wglGetProcAddress获取函数指针,从而可以访问到openGL最新版本中的所有函数。

注意:只要opengl32.dll能支持的OpenGL函数,当应用程序调用时,OpenGL32.dll总是将其“转发”给显卡驱动的实现,因此总是最新的实现,而不是1.1版本的实现。

现在,可以整理一个在windows平台使用OpenGL最新版本函数的步骤:

1)  使用第1章中的知识点创建OpenGL环境

2)  从OpenGL官方网站或任何其它文档中查找OpenGL函数名

3)  调用wglGetProcAddress(“functionname”)获得函数地址

4)  组织参数,利用函数指针调用特定函数

2.2 使用第三方库

按照2.1节中的步骤去使用OpenGL在理论上是完全可行的,但在实践上存在两个主要困难:

1)每次由程序员手工编码完成2.1节中的4个步骤是非常烦人的事情

2)仅仅有了函数指针还是不够的,还需要知道调用这个函数所需要的数据类型,

相关宏定义、相关枚举值,……,总之这是一个非常复杂的事情

因此,就有了第三方库,第三方库基本上就是根据OpenGL规范,由一群非常熟悉OpenGL的人弄出来的(否则怎么能知道每个枚举值?知道每个结构体的定义?)。

第三方库有不少,但最常见于各类书籍和代码的有两个:1)glut/freeglut  2)glew。当然其它的还有glee、glfw……。

2.2.1 GLEW库

Glew更多的是提供了对OpenGL扩展函数的支持。当然也包括基本OpenGL函数的支持。但它不提供其它类似窗体,键盘事件的支持函数。在与freeglut混和使用时,应该将#include <gl/glew.h>放在#include<gl/glut.h>之前,这样可以保证使用了最新版本的OpenGL函数。

Glew又分为了glew和glew_mx,前者是单线程版,后者是线程安全版。因为OpenGL的Rendering Context限制了每线程一个。如果需要在一个程序里同时出现多个OpenGL窗口,用glew mx是更好的方案。

2.2.2 glut/freeglut

Glut和freeglut,前者已经停止开发了,至少是进展缓慢。后者是前者的替代品,目前正在迅速开发中,能保持与最新的OpenGL一致。该库的主要优点是提供了一组简单的“窗体、鼠标、键盘事件”操作函数,能方便OpenGL学习程序的开发。当然该库也支持基本的OpenGL函数。

2.3 如何选择第三方库

如果只是需要使用最新的OpenGL函数,那么就选择Glew库,这时只需要使用第1章中的知识创建好OpenGL环境,然后使用glew中导出的函数即可。

如果想按照一些书籍上的例子进行实践,那一般是要选择freeglut或将其与glew结合使用。

既然有了第三方库,后续的章节就不再研究如何使用“纯粹”的windows自带的OpenGL库,而是研究如何使用第三方库进行开发。

在初学阶段,选择freeglut和glew的结合,以这样的方式来完成之后的例子。至于如何配置glew的环境,在之前的文章中以有介绍。

opengl在windows中使用最新的opengl相关推荐

  1. 【OpenGL】Android 中的 skia 和 OpenGL ES

    Android Graphic : apk and Skia/OpenGL|ES Android apk 里面的画图分为2D和3D两种:2D是由Skia 来实现的,也就是我们在框架图上看到的SGL,S ...

  2. OpenGL for Windows NT及其程序设计

    OpenGL是在SGI.Microsoft.DEC.IBM和Intel等多家世界著名计算机公司的倡导下,基于SGI的GL标准,制定的一个通用共享的开放式三维图形标准. 前几年,OpenGL虽然是开放式 ...

  3. Qt中使用GLEW进行OpenGL开发

    Qt中使用GLEW进行OpenGL开发(Windows平台) 为什么要使用GLEW 使用VS创建Qt项目 设置Widget 重新实现paintEngine 添加GLEW库到工程 设置OpenGL上下文 ...

  4. openGL在Windows 7(64位操作系统)下的配置小问题

    由于最近要交个计算机图像学的作业,所以就想在自己新的台式机上使用OpenGL开发计算机程序,自己的台式机上装了64位的windows操作系统,也安装了VS2010,查找了网上关于如何安装openGL已 ...

  5. 【转】《基于MFC的OpenGL编程》Part 2 Setting up OpenGL on Windows(1)

    本文源代码下载:OpenGL_ch2.rar WGL – Windows 的 OpenGL 扩展层 The WGL extension consists of a set of functions ( ...

  6. Windows下VS直接下载OpenGL库

    在VS2017中提供直接下载opengl库,无须我们自己下载安装. 1.点击项目-管理Nuget程序包 2.点击浏览,在搜索框中搜索Nupengl-两个都要下载 3.下载完即可使用,不用配置 每次重新 ...

  7. 视频直播:Windows中各类画面源的截取和合成方法总结

    当今,视频直播技术和实时音视频技术已经是很多行业必备,典型的应用场景有教育直播.远程视频会议.互联网娱乐等.在移动端发起直播,其画面源的种类是十分有限的,无非是取摄像头.截屏等.PC端由于其系统资源充 ...

  8. 【OpenGL】使用MinGW下gcc编译OpenGL的glut和freeglut库

    前言 GLUT/freeglut 是什么? OpenGL 和它们有什么关系? OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用.如果需要在程序里直接使用Open ...

  9. Windows中现在有独立的Linux文件夹系统

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | xplanet 来源 | 公众号「开源中国」 ...

  10. android opengl es 纹理 不同设备 白色,android – OpenGL ES 2.0纹理没有在某些设备上显示...

    早上好,这是2个纹理非幂的典型例子. 由于多种原因,纹理在分辨率上需要2的幂,这是一个非常常见的错误,每个人都碰巧陷入这个陷阱:)我也是. 2个纹理的非功率在某些设备/ GPU上运行平稳的事实,仅仅取 ...

最新文章

  1. 开源博客QBlog开发者视频教程:生命周期Page_Load介绍及简洁传递参数的重构方式(四)...
  2. linux服务器ftp上传文件为空,Linux 服务器 ftp上传文件出现的问题
  3. js解码与编码是什么意思?
  4. System.getProperty(属性名)方法的使用
  5. android float类型保留两位小数_你知道MySQL中Decimal类型和Float Double的区别吗?
  6. JVM 晋升到老年代的动态年龄判断
  7. 使用Sigar做后台服务器管理时,遇到的linux上的问题
  8. JSP教程第5讲笔记
  9. jsonp实现原理详细介绍
  10. PHP网站开发的流程步骤
  11. tampermonkey(油猴)跨域发送请求
  12. 构建微服务技术中台,SpringCloud和Kubernetes该如何选型?
  13. 使用Hbuilder搭建MUI框架
  14. icloud显示账户详情不可用_iCloud提示账户详情不可用怎么办 iphone提示账户详情不可用的解决方法...
  15. C语言中的半角字符,java全角、半角字符的关系以及转换详解
  16. gmx一定要在linux下运行么,gmx_mmpbsa使用说明
  17. 对Linux内核tty设备的一点理解(转)
  18. 位(bit)、字节(Byte)、MB(兆位)换算关系
  19. 【游戏测评】《海盗来了》:四手终与双拳难辨
  20. JavaScript补齐指定位数

热门文章

  1. mysql 优化配置 大批量数据插入_MySQL数据库插入100w条数据要花多久?
  2. python分类时特征选择_推荐 :使用Python实现机器学习特征选择的4种方法(附代码)...
  3. javaagent的优势
  4. windows 2003 iis php,windows 2003 iis安装php 5.2版本步骤
  5. (7)Spring框架----面向切面编程(一个简单的约定游戏)
  6. 汇编:1位16进制数到ASCII码转换
  7. 安装程序无法验证产品密钥解决方案
  8. 第二十七讲 DataSet和XML
  9. python实现天气功能查询
  10. cvSplit(),cv图像颜色通道分割和融合