OpenGL 知识二
OpenGL综述
学习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 的官方网站。这些可以由简单或由底层到面向对象几个层次。
- OpenGL 初始化工具:建立 OpenGL 上下文经常需要平台相关的一些代码去创建窗口,然后加载 OpenGL 函数,这些工具大大简化了这些过程,并提供跨平台的解决方案
- 上下文/窗口工具
| simple window | “multimedia library” | widget toolkits | 
|---|---|---|
| freeglut | Allegro version 5 | FLTK | 
| GLFW | SDL | Qt | 
| GLUT | SFML | wxWigets | 
- OpenGL 加载函数
GlEW和 gl3w(主要集中与 OpenGL3/4 Core )
- 实用工具:不非常依赖 OpenGL,但是在开发 OpenGL 工具时十分有用。
- 图像和纹理库 
 DevIL
 FreeImage
 SOIL
 GLI
 glraw
- 数学库 
GLM 和 TVMet
- 利用 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 知识二的更多相关文章
- window7使用svn(svn系列 客户端  知识二总结)
		♣eclipse插件subclipse ♣TortoiseSVN ♣svn操作 ♣注意事项 使用svn可以在eclipse直接装subclipse或者在windows使用TortoiseSVN ... 
- java 基础知识二 基本类型与运算符
		java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ... 
- 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)
		♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ... 
- 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理
		菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ... 
- {Python之线程}    一 背景知识     二 线程与进程的关系     三 线程的特点     四 线程的实际应用场景     五 内存中的线程     六 用户级线程和内核级线程(了解)     七 python与线程     八 Threading模块     九 锁     十 信号量     十一 事件Event     十二 条件Condition(了解)     十三 定时器
		Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ... 
- Dapper基础知识二
		在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper? 首先Dapper是支持多种数据库的 ... 
- python基础知识(二)
		python基础知识(二) 字符串格式化  格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串  print(' %s is boy'%('tom')) ----> ... 
- openGL实现二维图形和三维图形
		openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是ope ... 
- OpenGL(二)——函数库简述
		简述 1. OpenGL用到的库分为OpenGL核心库.OpenGL实用库.OpenGL辅助库和OpenGL工具库(不是必须) 2. OpenGL核心库 核心库包含有115个函数,函数名的前缀为gl ... 
随机推荐
- 《Scrum实战》读书会作业01 - 用知行视角总结现在或者过去的一个项目
			下面是<Scrum实战>读书会的第1个作业,主要是用知行视角来总结回顾现在或者过去的一个项目. 项目背景 2011年初,我做的项目是一个搜索引擎相关的项目,这个项目为公司在全球范围内的金融 ... 
- GCC编译错误小结
			gcc编译时对’xxxx’未定义的引用问题可能错误 错误一: 没有实现xxxx 错误二: c++引用c语言so库,但是so库头文件没有extern "C" 错误三: 检查各个共享库 ... 
- ssh远程服务器
			使用用户名密码登录 在命令行中输入命令: ssh username@ip_address -p port 之后系统会提示输入密码,输入后即可登录 如果不添加-p选项,则默认是22端口 还可以使用-l选 ... 
- vmrun命令
			VMWare提供了vmrun与VIX API两种手段使用户可以通过程序对虚拟机进行控制. 在官方文档中给出了详细的说明和示例代码. vmrun:http://www.vmware. ... 
- C++ 指针二维数组, C++二维指针数组笔记
			C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ... 
- 第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP
			第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP 设置代理ip只需要,自定义一个中间件,重写process_request方法, request ... 
- 多线程系列三:Lock和Condition
			有了synchronized为什么还要Lock? 因为Lock和synchronized比较有如下优点 1. 尝试非阻塞地获取锁 2. 获取锁的过程可以被中断 3. 超时获取锁 Lock的标准用法 p ... 
- e612. Moving the Focus to the Next or Previous Focusable Component
			The methods to move the focus to the next or to the previous focusable component are Component.trans ... 
- ubuntu -- 不输入密码执行sudo
			作为ubuntu等桌面系统,默认登录的帐号是没有root权限的,为了提升权限来执行任务,我们一般用到 "sudo+命令" 来执行,但是不难发现我们 一般都要输入密码.那么有没有什么 ... 
- (实用)Linux下安装JDK和Eclipse
			安装Eclipse时前需要确保系统中已经具备Java运行环境,本文以干净系统初次安装Eclipse为例,同时安装JDK和Eclipse. 1.下载JDK压缩包: http://www.oracle.c ... 
