如何使用OpenGL中的扩展
经常会看到论坛里面有人这样问:哪里能下载OpenGL2.0的头文件和库文件?
其实,对于一个刚刚接触OpenGL的新手来说,如果是在Windows平台下开发,这个问题是一定会经历的,为什么呢?因为很多参考书上都会提到OpenGL2.0,但是微软对OpenGL的支持只到1.1,1.1以后微软就不再支持了,为什么,因为微软更想发展自家的DirectX。所以如果想使用OpenGL1.1以上的功能或者函数,只能使用OpenGL扩展,这些扩展是一些OpenGL团体或个人开发出来的能Windows上使用的OpenGL1.1以后的一些功能及函数。所以,在Windows上根本就没有什么OpenGL2.0的头文件或库文件了,OpenGL1.1以后的东西都已经以扩展的形式存在了,而且,并没有一个统一的标准,你可以使用glex,glew,glee等等。下面我给出两种常用的方法:
大多数人都是在运行红宝书中的程序时遇到这个问题,比如这个函数glBlendEquation,它就是GL_ARB_imaging扩展中的一个函数。所以,在使用一个扩展之前,首先要做的就是判断你的显卡是否支持该扩展。
二. 如何判断显卡所支持的扩展:
使用函数glGetString,看一下它的原型:
const GLubyte * glGetString( GLenum name )
我们以GL_EXTENSIONS为参数调用该函数,就能获得当前显卡所支持的所有扩展,像下面这样:
const GLubyte *str = glGetString(GL_EXTENSIONS) ;
cout << str << endl ;
输出的各个扩展之间以空格分隔,如果这些扩展中包含GL_ARB_imaging,那么你就可以使用glBlendEquation这个函数了。
当然,这样查询的只是gl扩展,还可以用gluGetString获得glu扩展。
三. 使用扩展函数
在判断了显卡所支持的扩展以后,就可以使用该扩展中所包含的函数了下面详细介绍两种使用扩展函数的具体方法:
使用glext
这里下载:(http://graphics.ethz.ch/pointshop3d/sourcedoc/html/glext_8h-source.html)
a)头文件的包含 这个文件并不是Windows系统中原有的,需要到网上下载。使用的时候有一点要注意,如果程序中还用到了glut.h文件,那么一定要把glext.h放在glut.h的后面,因为glext.h要用到gl.h,而glut.h中包含了gl.h,如果顺序搞错了,编译的时候会有一大堆错误,正确的顺序如下:
#include <iostream>
#include <windows.h>
#include <GL/glut.h>
#include <GL/glext.h>
b)获取函数指针
先定义函数指针,PFNGLBLENDEQUATIONPROC glBlendEquation = NULL;
再获取函数地址, 使用wglGetProcAddress函数,注意这一句要加在使用glBlendEquation函数的语句之前才有效,最后后面紧跟着使用glBlendEquation的函数语句,切记不要加在所有子程序的外面,否则获取的指针是无效的
glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");
例如可以这样加:
PFNGLBLENDEQUATIONPROC glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");
switch(key)
{
case 'a':
case 'A':
//Note: glBlendEquation is a subset of GL_ARB_imaging, please call glGetString
//first to confirm whether your video card support this extension.
glBlendEquation(GL_FUNC_ADD) ;
break ;
case 's':
case 'S':
glBlendEquation(GL_FUNC_SUBTRACT) ;
break ;
如果觉得上面的方法麻烦,那么可以使用下面的方法:我推荐这种方法:
1. 使用glew
glew也是一个扩展库,包含了OpenGL中许多核心及扩展函数,现在的版本是1.3.5,支持OpenGL2.1,可以到这里下载:
上面的方法可能有些麻烦,如果已经下载了glew库的话,那么可以直接使用该扩展,但是使用之前首先要确定你的显卡是否支持该扩展。方法如下:首先还是要判断显卡是否支持该扩展,我们这里假定已经支持,
1.包含头文件glew.h,注意这里和上面不同,这回glut.h要放在glew.h的后面了
像下面这样
#include <GL/glew.h>
#include <GL/glut.h>
然后就可以在程序中直接使用glBlendEquation了,其他扩展的判断和使用方法与此类似。
最后还有一点切记!那就是还要调用glewInit() ;来初始化一下方可使用扩展,如下:
GLenum err = glewInit() ;
if (GLEW_OK != err)
{
MessageBoxA(NULL, "error", "My Window", 1) ;
}
好了,现在可以放心使用扩展了,赶快继续你的OpenGL之旅吧!
说明:上面的链接都是国外的官方站点链接,所以如果上不去外网,我可以给大家传一份
再提供几个好一点的OpenGL站点:
第一位:当然是http://www.opengl.org/
如何使用OpenGL中的扩展的更多相关文章
- CSharpGL(6)在OpenGL中绘制UI元素
CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...
- 【GLSL教程】(二)在OpenGL中使用GLSL 【转】
http://blog.csdn.net/racehorse/article/details/6616256 设置GLSL 这一节讲述在OpenGL中配置GLSL,假设你已经写好了顶点shader和像 ...
- OpenGL中FBO的概念及其应用 [转]
http://www.cppblog.com/kongque/archive/2010/08/26/124754.html FBO一个最常见的应用就是:渲染到纹理(render to texture) ...
- OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...
- openGL中的gl,glu,glut
OpenGL函数库相关的API有核心库(gl).实用库(glu).辅助库(aux).实用工具库(glut).窗口库(glx.agl.wgl)和扩展函数库等.gl是核心,glu是对gl的部分封装.glx ...
- CSharpGL(26)在opengl中实现控件布局/渲染文字
CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...
- OpenGL中坐标系的理解(一)
在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...
- Opengl中矩阵和perspective/ortho的相互转换
Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定 ...
- 解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程 昨天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅 ...
随机推荐
- PHP - 引用计数
引用计数以及是否是引用变量,一个神奇的函数,查看当前引用计数: <?php xdebug_debug_zval('a'); 以上例程会输出: a: (refcount=1, is_ref=0)= ...
- ubuntu 安装 rtpengine
摘要 RtpEngine推荐使用Debian系统,可以看出Debian系统的安装是最简单的.我是基于ubuntu18.04安装的.需要注意的是如果你的Ubuntu系统版本太低,安装时会遇到各种的版本太 ...
- 如何用Elasticsearch实现类似SQL中的IN查询实例
我想实现类似如下sql语句的效果: select * from table1 where rw_id in ('7a482589-e52e-0887-4dd5-5821aab77eea','c68ac ...
- 校准liunx时间简单好用的命令
查看时间服务器的时间# rdate time-b.nist.gov 设置时间和时间服务器同步# rdate -s time-b.nist.gov 查看硬件时间 # hwclock 将系统时间写入硬件时 ...
- 对称二叉树 · symmetric binary tree
[抄题]: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...
- cs api 之一
无法创建 无法创建网络 执行顺序
- sudo问题汇总
1. 注释Defaults requiretty Defaults requiretty修改为 #Defaults requiretty, 表示不需要控制终端. 否则会出现sudo: sorry, y ...
- Redis中redis.conf里面配置详解
是否将redis设置为守护程序,默认为no daemonize yes 如果设置为守护程序,需要指定pid文件 pidfile /var/run/redis/redis-server.pid ...
- linux查看操作系统版本信息
linux查看操作系统版本信息 摘自:https://www.cnblogs.com/vaelailai/p/7545166.html 一.linux下如何查看已安装的centos版本信息: 1.L ...
- JS中关于位置和尺寸的api
HTMLElement.offsetParent 由于offsetTop 和 offsetLeft 都是相对于 offsetParent 内边距边界的,故offsetParent的意义十分重大.off ...