[翻译]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_nameVENDOR(厂商)来自但不限于下表。

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.cglew.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!\n";
}

检测扩展

有两种方式来检测一个扩展是否支持:使用GLEW宏–一个较慢的方式–使用名称字符串
GLEW宏方式

if (GLEW_ARB_vertex_program)
{
...
}

glewIsSupported函数方式

if (glewIsSupported("GL_ARB_vertex_program"))
{
...
}

平台特定扩展

此外可以使用GLEW宏检测平台特定的扩展。或使用数wglewIsSupportedglxglewIsSupported)。要使用平台特定扩展,需要在inlcude “glew.h”之后include “wglew.h”或”glxglew.h”。

if (WGLEW_ARB_pbuffer)
{
...
}

练习

  1. 编写一个程序,它会检测您的计算机上安装的OpenGL核心版本并打印结果到控制台。(使用GLEWGlee为此!)
  2. 获取glGetString(GL_EXTENSIONS)返回的字符串最大长度?

[翻译]opengl扩展教程1的更多相关文章

  1. [翻译]opengl扩展教程2

    [翻译]opengl扩展教程2 原文地址https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/extensions_part2.php [ ...

  2. OpenGL官方教程——着色器语言概述

    OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) ...

  3. OpenGL ES教程系列(经典合集)

    为了搞透播放器的开发,花了些时间收集这些资料,虽然我已经搞定opengles渲染视频的内容,但是想玩玩opengles,往深里玩,图像处理这块是个好的方向,所以opengles是值得好好学的.   O ...

  4. windows7下安装php的imagick和imagemagick扩展教程

    这篇文章主要介绍了windows7下安装php的imagick和imagemagick扩展教程,同样也适应XP操作系统,Win8下就没测试过了,需要的朋友可以参考下 最近的PHP项目中,需要用到切图和 ...

  5. 中文翻译:pjsip教程(一)之PJNATH简介

    在学习pjsip的过程中,发现只是单单的阅读英文官方文档,对于里边概念的理解还是不够透彻,并且苦于pjsip没有发现全一点的中文版本,所以想尽自己所能为建设和谐社会而贡献一份力量,文中定会有所疏漏,希 ...

  6. QT OpenGL中文教程在QT4版本后的错误代码更改(一)

    由于教程中说的已经够可以了,这里就不对代码进行分析了,有兴趣可以自己去看看.这个教程来源于原来的NeHeOpenGL中文教程 (http://www.yakergong.net/nehe/) ,但其有 ...

  7. Firefox离线安装扩展教程

    Firefox离线安装扩展教程 解决问题博文:解决stackoverflow打开慢不能注册登录 应网友求助在上传了需要的扩展资源后,顺便写个离线安装方法,其实百度也行,这不写下来后为需求者省事.(*^ ...

  8. ubuntu 下编译glew (opengl扩展库)

    最近在研究咋样在QT 下使用opengl 扩展库glew.首先需要明白的是QT中对glut等库进行了封装,但是对glew和glfw等库需要自己编译后使用. 安装步骤: 1.下载Ubuntu下的glew ...

  9. OpenGL 完全教程(写给Delphi的开发者) 前言

    前言 在开发了许多2D图形程序之后,许多人开始对3D图形编程产生了兴趣.学习一套3D API,是进行3D图形编程的基础.在有趣的3D图形编程中,3D API只不过充当着一种低级的工具而已.因此,在这里 ...

随机推荐

  1. Ubuntu下apt-get命令详解

    在Ubuntu下,apt-get近乎是最常用的shell命令之一了,因为他是Ubuntu通过新立得安装软件的常用工具命令. 本文列举了常用的APT命令参数: apt-cache search pack ...

  2. python中单引号,双引号,多引号区别

    先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行如:s1 = "hello,world"如果要写成多行,那么就要使用\ (“连行符”)吧,如s2 = " ...

  3. SCWS分词扩展在WINDOWS下的安装方法

    安装之前先确认您是否拥有主机的安装权限,否则无法进行安装,安装步骤如下: 1. 根据您当前用的 PHP 版本,下载相应已编译好的 php_scws.dll 扩展库. 目前支持以下版本   [PHP-4 ...

  4. xss利用和检测平台

    xssing 是安全研究者Yaseng发起的一个基于 php+mysql的 网站 xss 利用与检测开源项目,可以对你的产品进行黑盒xss安全测试,可以兼容获取各种浏览器客户端的网站url,cooki ...

  5. Web框架们

    Python之路[第十八篇]:Web框架们   Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...

  6. Yii2.0高级框架数据库增删改查的一些操作(转)

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...

  7. Selenium 代码收集

    [转载]使用Selenium2测试含有iframe的Ajax网页  原文地址:http://www.cnblogs.com/hexin0614/archive/2012/03/24/2415670.h ...

  8. Java-java中无符号类型的处理

    在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre ...

  9. [css]通过transform缩放邮件客户端h5页面

    摘要 最近一直在折腾邮件通知的东东,大概逻辑就是如果有新邮件,向收件人的app推送一条服务号消息,并且在单击该消息的时候,需要展示邮件的详情. 技术 这里是使用Exchange EWS API来实现的 ...

  10. MEF搜索范围

    MEF对扩展组件的查找范围通常有三个: AssemblyCatalog:从某个程序集中查找. ApplicationCatalog:在应用程序所在的目录下查找. DirectoryCatalog:在某 ...