OpenGL特性

扩展(Extension)

OpenGL的一大特性就是对扩展的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上与运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以方便的检查显卡是否支持此扩展。

if(GL_ARB_extension_name)
{//使用一些新的特性}
else
{ //不支持此扩展:用旧的方式去做}

状态机(State Machine)

OpenGL自身是一个巨大的状态机:一个描述OpenGL该如何操作的所有变量的大集合。

OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置一些选项,操作一些缓存。最后,我们使用当前OpenGL上下文来渲染。

假设当我们想告诉OpenGL去画线而不是三角形的时候,我们通过改变一些上下文来改变OpenGL状态。从而告诉OpenGL如何去绘图。一旦我们改变OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。

用OpenGL工作时,我们会遇到一些状态设置函数(State-changing Function),以及一些在这些状态的基础上状态应用的函数(State-using Function)。只要你记住OpenGL本质上是个大状态机,就能更容易理解它的大部分特性。

对象(Object)

OpenGL库是用C语言写的, 同时也支持多种语言的派生, 但是核心是一个C库。 一些C语言
的结构不易被翻译到其他高层语言, 因此OpenGL设计的时候引入了一些抽象概念。 “对象”就
是其中一个。
在OpenGL中一个对象是指一些选项的集合, 代表OpenGL状态的一个子集。 比如, 我们可以
用一个对象来代表绘图窗口的设置, 可以设置它的大小、 支持的颜色位数等等。 可以把对象
看做一个C风格的结构体:

struct object_name {GLfloat option1;GLuint option2;GLchar[] name;
};

注:

原始类型(Primitive Type)
使用OpenGL时, 建议使用OpenGL定义的原始类型。 比如使用`float`时我们加上前缀GL(因此写作`GLfloat`)。

当我们使用一个对象时, 通常看起来像如下一样(把OpenGL上下文比作一个大的结构体):

// OpenGL的状态
struct OpenGL_Context
{...object* object_Window_Target;...
};
// 创建对象
GLuint objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置GL_WINDOW_TARGET对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文的GL_WINDOW_TARGET对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);

这一小片代码将会是以后使用OpenGL时常见的工作流。 我们首先创建一个对象, 然后用一个id保存它的引用(实际数据被储存在后台)。 然后我们将对象绑定至上下文的目标位置(例子里窗口对象的目标位置被定义成 GL_WINDOW_TARGET )。 接下来我们设置窗口的选项。 最后我们通过将目标位置的对象id设回0的方式解绑这个对象。 设置的选项被保存在 objectId 代表的对象中, 一旦我们重新绑定这个对象到 GL_WINDOW_TARGET 位置, 这些选项就会重新生效。

使用对象的一个好处是我们在程序中不止可以定义一个对象并且设置他们的状态, 在我们需要进行一个操作的时候, 只需要绑定预设了需要设置的对象即可。 比如, 有一个作为3D模型的数据(一栋房子或一个人物, 由多个子模型构成)容器对象, 在我们想绘制其中任何一个3D模型的时候, 只需绑定相应的子模型数据的对象(我们预先创建并设置好了它们的选项)就可以
了。 拥有数个这样的对象允许我们指定多个模型, 在想画其中任何一个的时候, 简单的将相应的对象绑定上去, 便不需要再进行重复的设置选项的操作了。

LearnOpenGL之OpenGL特性相关推荐

  1. LearnOpenGL 高级OpenGL—立方体贴图

    文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...

  2. C++学习(四四三)Android手机支持的opengl特性

    const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字 const GLubyte* biaoshifu = glGet ...

  3. 第一个OpenGL程序

    OpenGL包含200多个函数,大致分为如下几类函数: 图元函数(primitive function)指定要生成屏幕图像的图元.包括两种类型:可在二维.三维或四维空间进行定义的几何图元,如多边形:离 ...

  4. opengl中gpu与cpu交互_OpenGL 环境配置与教程推荐

    我们先了解一下 OpenGL 是什么: 摘自 Wikipedia: Open Graphics Library (OpenGL) is a cross-language, cross-platform ...

  5. OpenGL中的二维编程——从简单的矩形开始

    一.OpenGL的组成 图元函数(primitive function)指定要生成屏幕图像的图元.包括两种类型:可以在二维.三维或者四维空间进行定义的几何图元,如多边形:离散实体:位图. 属性函数(a ...

  6. OpenGL 开发环境配置

    From: http://www.cnblogs.com/kesalin/archive/2009/09/08/1562499.html OpenGL 下有一些重用的辅助库,比如glut,glee,g ...

  7. OpenGL版本与OpenGL扩展机制

    1 opengl的版本区别(在opengl官方文档中有详细说明)     针对Opengl不同版本的升级是主要是扩展指令集.     现在版本是4.0啦 1.1 opengl1.1 1995年,SGI ...

  8. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  9. 在英特尔® 凌动™ 处理器上将 OpenGL* 游戏移植到 Android* (第二部分)

    本文是两部分中的第二部分,讨论了将 OpenGL 游戏移植到 Google Android 平台存在的障碍. 在开始游戏植入项目(包括 OpenGL 扩展的差别.浮点支持.纹理压缩格式和 GLU 库) ...

最新文章

  1. 现代浏览器博物馆_云旅游!Tableau 为你揭秘纽约现代艺术博物馆的珍贵馆藏
  2. 无偏方差为什么除以n-1
  3. 计算机网络多线程通信,多线程技术的PLC与PC的通讯方式
  4. java 用sevlet实现ip定位以及天气预报的功能
  5. 快春运了,做个火车余票查询接口,余票来源12306,图是百度地图
  6. 没学过编程能学python吗_我没学过编程,能否学会Python?
  7. CAP BASE 最终一致性
  8. ModuleNotFoundError: No module named '_tkinter'
  9. windows编程之GDI基础--设备内容(二)
  10. 解决排列组合问题的通用算法(转)
  11. python脚本调度程序_python任务调度实例分析
  12. python代码怎么变成软件_python程序变成软件的实操方法
  13. java需要数学_学java要数学好嘛?
  14. 怎么获取大量新鲜可用的迅雷白金会员账号!?
  15. openwrt路由器-timeout while waiting for PADS.
  16. Visual Studio与UG版本对应关系
  17. 设备台式计算机显示叹号,台式电脑出现叹号不能上网怎么办_台式机电脑出现感叹号不能上网的处理方法-系统城...
  18. 强制客户端更新Silverlight XAP文件方法汇总
  19. 金之塔用 Python 获取日内分时均价,每分钟日成交量和每时刻结算价,及交叉作用曲线延伸
  20. 【论文笔记】Radatron: Accurate Detection Using Multi-Resolution Cascaded MIMO Radar

热门文章

  1. 【编译原理笔记15】运行存储分配概述,静态存储分配,栈式存储分配,调用序列和返回序列,非局部数据的访问,符号表,符号表建立
  2. uricode(GET参数) 转 object
  3. 手机学习android,用手机来学习 学生必备6款Android应用软件
  4. 引入dubbo项目接口_Dubbo框架的Hello World
  5. dhcp(客户端)协议使用哪个众所周知的端口号?_DHCP不详解
  6. 红米note3支持html,红米Note3什么配置参数?红米Note3标配有什么?
  7. 开始使用windows live writer写博客。
  8. ORACLE查询通用查询被锁对象以及解锁方案
  9. SSM框架之Spring MVC(二)常用注解说明
  10. [Regular] 4、正则表达式的匹配原理原则