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 ...
随机推荐
- 再谈git的http服务
因为git服务器搬迁,需要重新安装git服务器,在网上搜索了下,发现之前的方法太复杂,复杂到自己都没彻底弄明白.其实通过git自带的git-http-backend脚本配合apache2的http服务 ...
- MFC函数——CWnd::OnEraseBkgnd
CWnd::OnEraseBkgnd afx_msg BOOL OnEraseBkgnd( CDC* pDC ); 返回值: 如果它擦除了背景,则返回非零值:否则返回0. 参数: pDC 指定了设备环 ...
- Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)
1.执行顺序 1.1.一个类中的初始化顺序 类内容(静态变量.静态初始化块) => 实例内容(变量.初始化块.构造器) 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)= ...
- java android使用Gson解析泛型json数据
那就直接开始吧. 在我们获取服务器返回的json数据有时候会出现这种情况,比如: {"body":{"attrName":"feed",&q ...
- 两个有序单链表合并成一个有序单链表的java实现
仅作为备注, 便于自己回顾. import java.util.Arrays; public class MergeSort { public static class LinkedNode<V ...
- c指针 --笔记2返回指针值的函数
返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int arg ...
- 第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询
第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询 bool查询说明 filter:[],字段的过滤,不参与打分must:[] ...
- CI框架 -- 网页缓存
CodeIgniter 可以让你通过缓存页面来达到更好的性能. 尽管 CodeIgniter 已经相当高效了,但是网页中的动态内容.主机的内存 CPU 和数据库读取速度等因素直接影响了网页的加载速度. ...
- Java虚拟机垃圾收集器与内存分配策略
Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...
- MyBatis中对于字符串blank(null、empty)的判定方法
直接上代码,关键需要进行2个判定,一个是null判定,一个是 ‘’ 判定. <where> <if test="url!= null and url!=''"&g ...