[翻译]opengl扩展教程1
原文地址https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/extensions.php
简介
OpenGL
扩展是为了使用3D图形硬件的新功能。硬件厂商定义新的函数到OpenGL来支持新的或增强已有的特性。
由单个厂商创建的扩展是"vendor-specific"
(厂商特定),有多个厂商共同窗口的扩展是"multivendor"
(多厂商)。
如果"vendor-specific"
或"multivendor"
扩展证明是一个好的增强功能,那么OpenGL Architecture Review Board
(ARB是OpenGL管理机构的简称)也许会推进它成为一个"ARB approved"
(ABR认可)扩展。
如果这个扩展是非常好的,那么ABR
也许会将其整合到OpenGL的"core feature"
(核心特征)。一个非常好的例子就是"OpenGL Shading Language"
(OpenGL着色器语言)现在已经是OpenGL2.0或更高版本的”core feature”的一部分。
这个理念使得OpenGL变得非常强大,因为源代码保持向后兼容,10年前编写的OpenGL程序,现在还可以工作。
检测扩展
在一个有效的OpenGL上下文环境中,你可以使用glGetString(GL_EXTENSIONS)
来获取一个包含所有可用扩展的列表,它返回一个以空格分隔的长字符串。
所有的扩展形式:GL_VENDOR_extension_name
,VENDOR
(厂商)来自但不限于下表。
VENDOR | 描述 |
---|---|
ARB | ABR认可的扩展 |
EXT | 多厂商扩展 |
APPLE | 苹果计算机公司的扩展 |
ATI | ATI(AMD)科技公司的扩展 |
HP | 惠普公司的扩展 |
NV | NVIDIA的扩展 |
SGIS | Silicon Graphics的扩展 |
也有一些前缀不是GL
的扩展,它们是特定平台的。最著名的就是WGL
前缀的,它们是Windows平台特定的扩展。以及GLX
前缀的,它们是X-Window平台特定扩展。
使用扩展
在C++代码中使用扩展是-不幸的-是特定于平台。函数 (函数指针) 的地址,必须从OpenGL执行 (例如硬件驱动程序)中检索。在Windows下这可以使用wglGetProcAddress
来检索。
本行非原文翻译这里说一下,OpenGL的一些新增函数,往往不是直接使用源代码或者静态库链接到程序中去的,而是在程序运行的时候动态获取函数的指针,来调用函数的。本行非原文翻译
为了节省在多个平台处理所有函数指针和令牌的所有扩展的大量的时间,有一些好开源解决方案可用于简化此过程。其中之一是GLEW
,可在http://glew.sourceforge.net。另一个实现是Glee
,可在http://elf-stone.com/glee.php。都是好的处理扩展和修改的方法来,它们在BSD许可证下发布。(请务必阅读许可证的详细信息)。
GLEW入门
我要使用GLEW
,没有任何理由————Glee是一样好。最新版本的 GLEW 是 1.3.5 并支持 OpenGL 2.1 核心功能和其他一些新的扩展。
入门简介
可以把GLEW编译成静态库或者动态库。如果编译为静态库,请确保顶一个预处理的变量GLEW_STATIC
(在Windows下)。另一种方式是直接把glew.c
和glew.h
文件复制到你的代码中(如果在windows下,也必须定义GLEW_STATIC
)。这是我首选的方式,因为它使得跨平台编译和管理变得更简单。
你可以在这里下载我的GLEW+FreeGLUT的简单示例工程:
下载:OpenGL_Extensions_Tutorial.zip (GLEW和FreeGLUT以及包含在内)
它是一个Virtual Studio 7.1工程。它可以转换到8.0(速成版或更高)
(如果你创建一个不同平台[或编译器]的工程[或Makefile],请发送到christen@clockworkcoders.com,我将把它放在这里)
初始化GLEW
GLEW
需要初始化。当你进行初始化的时候,必须具有有效可用的OpenGL
渲染上下文。(在大多数情况下这意味着一个OpenGL窗口必须存在和激活)。
GLenum err = glewInit();
if (GLEW_OK != err)
{
// failed to initialize GLEW!
}
std::cout "Using GLEW Version: " glewGetString(GLEW_VERSION);
检测OpenGL版本
GLEW
允许检查 如果某些OpenGL
版本 (1.1、1.2、1.3、1.5、2.0、2.1)的所有核心扩展是否可用。如果你有安装OpenGL 1.3
,那么 OpenGL 1.2和1.1的核心扩展也会检测。
if (GLEW_VERSION_1_5)
{
std::cout "Core extensions of OpenGL 1.1 to 1.5 are available!
";
}
检测扩展
有两种方式来检测一个扩展是否支持:使用GLEW宏
–一个较慢的方式–使用名称字符串
GLEW宏方式
if (GLEW_ARB_vertex_program)
{
...
}
glewIsSupported函数方式
if (glewIsSupported("GL_ARB_vertex_program"))
{
...
}
平台特定扩展
此外可以使用GLEW
宏检测平台特定的扩展。或使用数wglewIsSupported
或glxglewIsSupported
)。要使用平台特定扩展,需要在inlcude “glew.h”之后include “wglew.h”或”glxglew.h”。
if (WGLEW_ARB_pbuffer)
{
...
}
练习
- 编写一个程序,它会检测您的计算机上安装的
OpenGL
核心版本并打印结果到控制台。(使用GLEW
或Glee
为此!) - 获取glGetString(GL_EXTENSIONS)返回的字符串最大长度?