2014-01-07 25 views
0

我需要使用函数glDeleteProgram(),但编译器告诉我该函数不存在。我觉得我的gl.h的版本太旧,但我无法找到如何在我的项目安装的OpenGL 4.3 ...在C项目中使用OpenGL 4.3

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <gl/gl.h> 

我想包括glext.h,但没有奏效。

+5

更新你的'gl.h'版本不会改变任何东西。 'glDeleteProgram(...)'是一个OpenGL 2.0函数,并且您的平台未扩展的OpenGL实现不支持OpenGL 2.0。扩展发生在运行时,所以包含一个头文件只会给你函数原型而不是有效的函数指针。最简单的解决方案是使用[GLEW](http://glew.sourceforge.net/)来处理运行时扩展加载。 –

+0

谢谢,我试了 – neeh

+0

我真的不明白OpenGL的版本控制,我的电脑上安装了OpenGL 4.3,为什么我的GL/gl.h还在1.1版本中? GLEW如何解决这个问题?你说GLEW“加载扩展名”,但这些扩展名在哪里?它是否下载这些? – neeh

回答

1

似乎有一点混淆,确切地说明了您的平台附带的gl.h标头的用途。我会尽量在下面更好地解释它,但请注意,这个头文件和平台的OpenGL库是非常相关的(并且基本上是不可变的)。当你提到“安装”OpenGL 4.3时,你实际上是在补充(在运行时而不是编译时)这个头文件所属的不灵活的库。


平台,如Microsoft Windows附带一个非常原始的软件实现的OpenGL(1.1在这种情况下),而是设计在安装显示驱动程序可以扩展/替换在运行时软件实现这样的方式。微软将此系统称为I nstallable C lient D河流。

对于所有的意图和目的,GLEW与您的显示驱动程序接口并加载OpenGL的所有部分比1.1更新。在不使用GLEW的情况下,您仅限于软件实现的功能,这些功能在Microsoft Windows上是在〜1997年编写的,从此以后从未更新过。 <GL/gl.h>在Windows上始终为1.1,因为驱动程序负责扩展GL,并且不会将软件直接编译/链接到显示驱动程序。你可以阅读扩展规范here,并用你需要的所有扩展函数原型,枚举和常量值来编写你自己的头文件...但是,多年来这个任务变得荒谬乏味(目前有超过120个ARB扩展)。 GLEW基本上将所有主要发布的扩展规范打包到一个大型库中,并将加载您的驱动程序声称支持的每个扩展。这实际上是GL版本控制的作用方式,每个新版本归结为需要的扩展。


早在一天,有这些血腥可怕的东西叫做MiniGL drivers,和游戏一样雷神之锤1实际上直接链接确实从喜欢的3Dfx以及PowerVR厂商极其原始和专有的驱动程序。幸运的是,我们已经过去了那些日子。

+0

感谢您的优秀回答,我终于明白了OpenGL兼容性限制的原因。 – neeh