OpenGL综述

September 14, 2014

学习OpenGL是学习计算机图形学的一个工具,因为计算机上图形的显示要依靠底层的软件和硬件,学习图形学除了学习基本的概念,线,曲面,图形生成,变换,渲染这些,做三维的图形图像显示时,从操作系统和驱动这一底层设计起显然费时不切实际,所以我们需要一套高级的图形接口。

我们可以认为 Opengl 就是这样的一个 API,OpenGL 有多种语言绑定,但是最终地最底层是一个 C 语言的 API接口。这组 API由一些 typedef,#define 和enumerator 值和函数(function)组成,typedef 定义了 GL 的基本类型,如 GLint,GLfloat。但是复杂的类型如结构没有直接在 OpenGL 显示出来。

在 C++中,如果一个对象包括一个整数,一个浮点数和一个字符串时,一般你会这样创建并读取它们:

struct Object{
int count;
float opacity;
char *name
}; Object newObject; newObject.count = 5;
newObject.opacity = 0.4f;
newObject.name = "some string";

在 OpenGL 中,一般你会这样用 API:

GLuint objectName;
glGenObject(1, &objectName); glBindObject(GL_MODIFY, objectName);
glObjectParameteri(GL_MODIFY, GL_OBJECT_COUNT, 5);
glObjectParameterf(GL_MODIFY, GL_OBJECT_OPACITY, 0.4f);
glObjectParameters(GL_MODIFY, GL_OBJECT_NAME, "Some String");

:以上只是一个例子说明API 的接口对象有什么不同,不是真实的 OpenGL 函数。

OpenGL 规范

从技术的意义上来说,OpenGL 不是一个 API,而是一种规范,一个文件。我们所说的 C API 只是它的一个实现。规范定义了 OpenGL 的初始状态,什么样的函数不改变他的状态,调用渲染的函数时会发生什么这些。

这个规范是 OpenGL Architectural Review Board(ARB)写的,这个组织由 Apple,Nvidia,AMD(ATI part)等公司的人员组成,这个组织,也是 Khronos Group 的一部分。这个是复杂而且十分技术性的,当然你也可以去阅读他,需要注意的是,这个规范只规定了结果,而不是实现过程,是面对用户来说的,不论硬件的供应商如何实现 OpenGL,用户应该不能分辨出不同。所以说,尽管 ARB 组织管理着 OpenGL 规范,但不控制 OpenGL 的代码,在一个硬件上如何用代码实现是由供应商的开发者决定的。OpenGL 在不同的操作系统上实现也不相同,在 Windows 上,这些实现是由硬件制造商实际控制的,但在 Mac OSX 上大部分由 Apple实现,硬件供应商开发内部的驱动,Linux 上则更为复杂。。。(如 Mesa 3D 就是 OpenGL 的开源软件实现)总的来说,OpenGL 实现由软件操作系统和硬件制造商共同协商实现。

OpenGL 版本

OpenGl 的实现有很多版本(最新的是4.4),我们不需要对所有版本都熟悉,应该从尽可能新的版本学起。OpenGL 的版本不像 Direct3D 版本,会更改大部分 API,OpenGL 大多向下兼容,但是到了 OpenGL 3.0以后,随着图形卡的架构发展,OpenGL的结构也发生了很大改变(可编程着色器),v3.1后移除了很大一部分函数,去除了大部分固定管线的内容,所以如果再有书上或教程上从固定管线讲起,那么它一定是过时的了。所以现在的 OpenGl分为两个部分(或者称为 profiles):core 和 compatibility,compatibility 部分仍让向后兼容。

OpenGL Framework

OpenGL 是比较底层的 API,有利于我们学习计算机图形学,但是利用这些接口做出可与操作系统交互的程序,或者简化我们编程时的工作量,我们需要一些框架工具,当然以 OpenGL 为核心的框架很多,都包括基本的和不同的操作系统窗口交互,创建上下文,加载 OpenGL 函数直至面向对象的框架。这些可以称为 OpenGL 的 SDK ,其中包括了很多的 Framework,详细资料可以查看 OpenGL 的官方网站。这些可以由简单或由底层到面向对象几个层次。

  1. OpenGL 初始化工具:建立 OpenGL 上下文经常需要平台相关的一些代码去创建窗口,然后加载 OpenGL 函数,这些工具大大简化了这些过程,并提供跨平台的解决方案
  2. 上下文/窗口工具
simple window “multimedia library” widget toolkits
freeglut Allegro version 5 FLTK
GLFW SDL Qt
GLUT SFML wxWigets
  • OpenGL 加载函数

GlEW和 gl3w(主要集中与 OpenGL3/4 Core )

  1. 实用工具:不非常依赖 OpenGL,但是在开发 OpenGL 工具时十分有用。
  • 图像和纹理库
    DevIL
    FreeImage
    SOIL
    GLI
    glraw

  • 数学库

GLM 和 TVMet

  1. 利用 OpenGL 开发的面向程序接口或者引擎,便于3D 图形绘制。

Open Inventor,Oger3D,ClanLib 等。

在初学 OpenGL 时,一般我们会用到 freeglut(相对简单)、GLFW、GLEW 这几个框架,配合 QT 开发图形界面,或者用 SDL 做一些简单的应用

很多书上都把 OpenGL 的 API 接口定义为一种状态机模型,(不过我在比较新的 OpenGL 编程模型学习中觉得这一个观点已经过时了,但是这一句话估计在有关 OpenGL 的书上很常见,而且 OpenGL 又是向后兼容了,称为状态机模型不能说错)。所以会经常见到 OpenGL context(上下文)这一术语,context 不能简单地概括,从以后的学习我们可以了解。

原文链接:http://foryo24.farbox.com/post/opengl

OpenGL 知识二的更多相关文章

  1. window7使用svn(svn系列 客户端 知识二总结)

     ♣eclipse插件subclipse  ♣TortoiseSVN  ♣svn操作  ♣注意事项 使用svn可以在eclipse直接装subclipse或者在windows使用TortoiseSVN ...

  2. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  3. 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)

    ♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ...

  4. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  5. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  6. Dapper基础知识二

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper?     首先Dapper是支持多种数据库的 ...

  7. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  8. openGL实现二维图形和三维图形

    openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是ope ...

  9. OpenGL(二)——函数库简述

    简述 1. OpenGL用到的库分为OpenGL核心库.OpenGL实用库.OpenGL辅助库和OpenGL工具库(不是必须) 2. OpenGL核心库 核心库包含有115个函数,函数名的前缀为gl ...

随机推荐

  1. 微信小程序——极点日历使用方法

    极点日历github项目地址 添加至自己的小程序方法 极点日历属性接口文档 代码实例: xml: <calendar calendar-style="calendar" he ...

  2. Android  <meta-data>

    在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application>.<servic ...

  3. Axiom3D:手动创建ManualObject与Mesh,以及如何使用Cg着色器语言

    在开始正文前,先说下Axiom3D里遇到的二个BUG. 1.在启动axiom生成的程序中,我发现输出里总是有一些如"billboard_type","billboard_ ...

  4. c数据结构第一个公式写程序计算给定多项式在给定点x处的值

    假设x=2,那么a的数组有几个, 那n就是根据索引来的 假设数组[, , , , ] n就是0, 1, 2,,3, 4 f = + ( + ( + ( + ()))) f = + ( + ( + ( ...

  5. 珍藏40个android应用源码分享

    1.高仿京东商城源码http://www.apkbus.com/android-115203-1-1.html 2.抽屉demohttp://www.apkbus.com/android-115205 ...

  6. android WiFi ASSOC_REJECT 流程跟踪

    Android设备在于AP关联时,如果AP返回关联拒绝帧,Android设别会把AP加入黑名单中. 黑名单中的设备将会在扫描时,延时一段时间放在后面处理. 代码以及log基于SDM450, Andro ...

  7. Eclipse初次java开发问题总结-3

    上篇中提到解决的一个问题是mysql驱动报的: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  8. 事件的监听是由awt完成的

    学swing 之前先学awt ,因为awt 是Java实现图形界面的基础. 它能够完成编写界面的基本功能,最重要的是,事件的监听是由awt完成的. 而swing是在awt基础上提供的新的界面工具包,它 ...

  9. CI框架 -- 在视图文件中使用 PHP 替代语法

    如果你不使用 CodeIgniter 的 模板引擎, 那么你就只能在视图文件中使用纯 PHP 语法了.为了精简视图文件, 使其更可读,建议你在写控制结构或 echo 语句时使用 PHP 的替代语法. ...

  10. sqlite学习笔记1:编译数据库

    首先说下我使用的是Linux环境 一 下载源代码 官网下载:点这里 二 编译 1 解压 下载完毕之后通常会在当前用户的"下载"文件夹中,首先cd到下载文件夹,然后创建一个文件件.用 ...