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 ...
随机推荐
- jquery.nestable.min.js可拖动标签
主容器为一个叫div的classname为dd的东西. 只要对这个主容器进行捕获加上一个方法 nestable就可以了. 可以给的属性为 serialize 直接以字符串的形式给入,意思就是按 ...
- altium designer 快捷键
2010年03月27日 环境快捷键 F1 访问文档库 (in context with object under cursor) Ctrl + O 访问选择的文档打开对话框 Ctrl + F4 关闭活 ...
- Navi.Soft31.开发工具(含下载地址)
1系统简介 1.1功能简述 在软件开发过程中,我们需要经常对字符串.文件.数据库操作.有时需要浏览Json格式串,有时需要浏览Xml格式串,有时需要读取txt或excel文件,有时需要对数据库访问.本 ...
- [Intellij] 软件设置和常用快捷键
理解Project 和 Module 一个 Project 是由一个或多个 Module 组成,模块之间尽量是处在同一个项目业务的的情况下,彼此之间互相依赖关联.如: Project : spring ...
- Textrank权值提取文本标签提取:
Textrank权值提取文本标签提取: 我已经爬取到了指定博主的新浪微博,然后我想从微博中提取出可以代表该博主兴趣特征的100个关键词,然后由这100个关键词提取出10个标签,代表博主的兴趣.我们此处 ...
- USB2.0学习笔记连载(六):USB2.0硬件设计需要注意事项
笔者在设计USB2.0时找到了一个官方给的硬件设计正确设计指南,其中有些内容还挺nice的.不单单只是USB的设计,其中有些思想可以应用到其他的场合中. 对于USB2.0而言,全速状态下可以达到480 ...
- Mac下Pycharm导入Python包
1.png 2.png 3.png
- 单表多个Count 条件进行查询拼接小妙用
单表多数据进行拼接 DROP table if EXISTS tmp_table; CREATE TEMPORARY TABLE tmp_table ( 创建临时表 SELECT p1q04,p2q0 ...
- selenium+java-查找页面中包含关键字的URL
package seleniumLearn1; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep ...
- (转)常见LCD接口
LCD常用接口原理 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 xubin 平台信息:内核:linux2.6/linux3.0系统: ...