------------------------------------------------------------------------------------------------------------------------

从现在开始,认真学习OpenGL的相关知识,把读过的每一章都做记录,希望能坚持到最后。

------------------------------------------------------------------------------------------------------------------------

我从大家所熟知的”OpenGL红宝书“,即OpenGL编程指南第八版开始入手,该书已经结合了OpenGL4.3的新特性。

因为是看的是中文翻译版本,我打算和英文原版一起看,有时候确实是必须的,因为看英文更接近本质。

------------------------------------------------------------------------------------------------------------------------

坚持每一篇都写个例子,印象会更加深刻。好了,不说废话,开始了。

------------------------------------------------------------------------------------------------------------------------

【OpenGL背景】

OpenGL发展到现在,已经超过了20年的时间。作为一个成熟而久负盛名的跨平台的计算机图形应用程序接口规范,

它已经被广泛应用于游戏,影视,军事,航空航天,地理,医学,机械设计,以及各类科学数据可视化的领域。

另外,随着网络以及移动平台的崛起,WebGL以及OpenGL ES的标准也逐渐深入人心,这两者同OpenGL有着千丝万缕的联系。

OpenGL几乎支持所有现有的主流操作系统平台,包括Windows、Mac OS X以及各种UNIX平台。同时也可以用于几乎所有

主流的编程语言包括C/C++、Java、C#、VB、Python、Perl等。可以说OpenGL无处不在。而目前流行的游戏引擎cocos2d-x

底层的渲染即是采用了OpenGL技术,要理解以及修改引擎架构,就不可避免的要接触OpenGL,这也是我学习的一个方向。

------------------------------------------------------------------------------------------------------------------------

【什么是OpenGL】

OpenGLOpen Graphics Library,开放图形库。

OpenGL是图形硬件的一种软件接口(The OpenGL graphics system is a software interface to graphics hardware.),

即可以对图形硬件设备特性进行访问的软件库,方便我们开发交互式的三维计算机图形应用程序。

OpenGL被设计为与硬件无关的接口,因此它是跨平台的。那么我们就可以在不考虑操作系统的前提下,实现我们的OpenGL接口。

OpenGL自身并不包含任何执行窗口任务或者处理用户输入的函数,不过没关系,我们将会用到一个第三方跨平台的库

GLUT(OpenGL Utility Toolkit)来帮助我们处理这些窗口事件,关于它的内容接下来会介绍。

另外,OpenGL也没有提供任何用于表达三维物体模型(models of three-dimensional objects),

或者读取图像文件(例如JPEG文件)的操作。

取而代之,我们需要通过一系列的几何图元(包括点、线、三角形以及Patch)来创建三维空间的物体。

OpenGL是采用客户端-服务端的形式实现的,我们自己所编写的应用程序可以当做客户端,而计算机图形硬件厂商所

提供的OpenGL实现可以看做是服务端。(OpenGL is implemented as a client-server system,with the application

you write being considered the client, and the OpenGL implementation provided by the manufacturer

of your computer graphics hardware being the server.

OpenGL 是基于光栅化的系统(rasterization-based system),用于生成图像。但还有其他方法例如光线追踪

(ray tracing),但有可能也需要用到OpenGL来显示图像。

------------------------------------------------------------------------------------------------------------------------

【OpenGL程序渲染图像主要的操作】

1、为构建形状(Shape)指明(Specify)来自OpenGL的几何图元的数据。

2、使用不同的着色器(Shapes)对输入的图元数据执行计算操作,由此来判断它们的位置、颜色、以及其他渲染属性。

3、将输入图元的数学描述转换为在屏幕位置上相对应的片段(fragments)。这个过程称之为光栅化(Rasterization)。

4、最后,为每个经过光栅化阶段的片段执行片段着色器(fragment shader),该操作决定了片段的最终颜色以及位置。

5、有时可能需要对每个片段(per-fragment)执行一些额外的操作。

例如判断片段产生的对象是否可见,或者将片段的颜色和当前屏幕位置的颜色相融合。

------------------------------------------------------------------------------------------------------------------------

【理解常用的图形学名词】

渲染(Rendering):表示计算机从模型创建最终图像的过程。

模型(Model):或者又称为对象,是通过几何图元(geometric primitives)例如点(points)、线(lines)

和三角形(triangles)来构建的。而这些几何图元是通过顶点(vertices)来指明的。

着色器(Shaders):它是图形硬件设备所执行的一类特殊函数。

理解着色器的最好方法是把它看做专门为图形处理单元(GPU)编译的一种小型程序。

OpenGL在其内部包含了所有的编译器工具,可以直接从着色器代码创建GPU执行所需代码。

在OpenGL中,会用到四种不同的着色阶段(shader stages)。最常用的包括顶点着色器(vertex shaders)和

片段着色器(fragment shaders)。前者用于处理顶点数据(vertex data),后者用于处理光栅化后的片段数据。

像素(pixel):指的是显示器上最小的可视单元。在计算机系统中存储于帧缓存中。

帧缓存(framebuffer):由图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。

------------------------------------------------------------------------------------------------------------------------

【关于GLUT以及GLEW】 

你可能会经常在OpenGL程序代码中看到以glut开头的函数,他们来自第三方库OpenGL Utility Toolkit,就是我们所说的GLUT。

这是一个非常流行的跨平台工具库(cross-platform),可以用来显示窗口、管理用户输入,以及执行其他操作。

另外Freeglut是原始OpenGL库的一个新变种。

你也可能会看到类似glewInit()这样的函数,它来源于OpenGL Extension Wrangler,也就是GLEW

官网关于它的介绍如下:

The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library.

GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform.

正如上文所说的,GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口。GLEW能自动识别你的平台所支持的全部OpenGL高级扩展涵数。

------------------------------------------------------------------------------------------------------------------------

看了又写了这么多字,想必都有点迷糊了。

接下来就应该写写Hello OpenGL了。

2015.06.29

广州

最新文章

  1. MVC4中 访问webservice 出现无法找到资源的错误
  2. UDP异步通信
  3. Delphi iOS 开启文件共享 UIFileSharingEnabled
  4. Web Service中的几个重要术语
  5. ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面
  6. codevs 3123 高精度练习之超大整数乘法
  7. C语言小结之结构类型
  8. cocos2dx进阶学习之CCScene
  9. SecureCRT 选择Courier New等其他字体.
  10. hexo工具介绍及使用方法
  11. 【MySQL】查看字符集对应的校对规则show collation like 'gbk%';
  12. 【Python】正则表达式纯代码极简教程
  13. 第三节,使用OpenCV 3处理图像(模糊滤波、边缘检测)
  14. ASP.NET MVC 路由篇二
  15. FancyBox的使用技巧 (汇总)
  16. JAVA 爬虫Gecco
  17. 使用Git【转】
  18. web安全之xss攻击
  19. poj-2342-简单树形dp
  20. nodejs封装mssql

热门文章

  1. CnBlog客户端Windows Live Write安装方法
  2. 使用composer安装项目依赖
  3. Oracle中INSTR、SUBSTR和NVL的用法
  4. hdu4067
  5. 0526 Sprint1个人总结 & 《构建之法》第八、九、十章
  6. 论文 查重 知网 万方 paperpass
  7. 北大poj- 1028
  8. JS总结 本地对象2 BOM DOM
  9. iOS-打电话、发短信、发邮件、打开浏览器
  10. 区分苹果Safari浏览器