OpenGL 编程指南(第八版)学习笔记——1 OpenGL概述

看完OpenGL 编程指南(第八版)已经有一段时间了,一直想整理一下这本书的知识。我将会按书中的章节,每一章一篇博客,讲述一下书中一些对于初学者难理解的点。

书中有很多例子,随书的源代码实现的例子并不多,而且很多例子有些错误没法运行。我用VS2015重新对随书源代码进行里整理,全部使用VS2015运行测试通过。对于书中很多没有实现的例子,我也进行了实现。

OpenGL 编程指南学习资料以及我整理的代码下载地址https://pan.baidu.com/s/1bqrcspD

文中提到的代码为下载文件中的“OpenGL编程指南 VS2015代码.zip”文件,代码也可以到github上下载:https://github.com/Kylewlk/OpenGL-Programming-Guide-8th-Edition-Code

 

1 OpenGL概述

OpenGL是一套跨平台图形接口API规范。OpenGL之所以跨平台是因为各个平台都有根据OpenGL规范实现相应的API接口,在Windows,Linux,Mac OS X等平台都有各自的实现,各个平台会提供OpenGL的程序接口。OpenGL提供了一套图形接口API,而图形主要由显卡控制,所以OpenGL相当于一套操作显卡的API接口,显卡厂商(NVidia,ATI等)会对提供OpenGL的驱动,使用OpenGL也就是对显卡设备进行编程。并不存在一个OpenGL开发的SDK程序包,因为OpenGL只是一套规范,具体的实现与平台相关,且与显卡厂商相关。

 

使用OpenGL

创建窗口和事件处理

OpenGL只是一套图形接口,并没有包含窗口的创建,鼠标键盘事件的处理,这些本身与平台相关而且复杂繁琐。为了处理这部分工作,我们使用了一个免费开源跨平台库freegult(https://sourceforge.net/projects/freeglut/),使用freegult可以很简单的创建OpenGL窗口处理窗口事件。Freegult官网提供可源代码,源代码使用的是cmake工程,我们可以使用cmake生成我们想要的工程文件,如VS2010,VS2015,makefile等等。

 

OpenGLAPI访问

因为OpenGL规范是不断在更新的,而操作系统更新并没有这么频繁,所以平台提供的OpenGL头文件和lib文件(windows上为gl.h和opengl32.lib)很难与最新版本OpenGL一致。为了防止编译链接错误,所以采用函数指针的方式访问OpenGL API。在Windows平台上用来获取OpenGL API函数指针的函数为wglGetProcAddress(LPCSTR),只需要提供一个Opengl函数名,如果平台支持,该函数会返回相应的函数指针,如何不支持则返回空指针。这部分工作也跟平台相关,且需要考虑各个OpenGL的版本,为了处理这部分工作我们使用了另一个开源跨平台库glew(http://glew.sourceforge.net/)。该库可以自动识别平台和OpenGL版本,并加载相应的函数。因为该库代代码量不多,文件(glew.h/glew.c)很少,我一般直接将该库代码包含到项目中使用。

本书中所有例子都使用了这两个库,Freegult和Glew。

 

绘制流水线

虚线框中的步骤是可以省略,其他步骤每次渲染都会有,各个过程具体内容参见书籍。

程序例子分析

程序运行结果,如下图,绘制了两个三角形,具体代码分析见书籍。

 

这是一个很简单的例子,例子使用了上文提到的Freegult和Glew两个库。

 

例子的绘制管线如下,重点关注三个红框中的步骤,其他步骤书本后续有讲解:

顶点数据

OpenGL使用的是规格化设备坐标(NormalizedDevice Coordinate, NDC),规格化设备坐标的范围为[-1.0, 1.0]之间,即OpenGL中x, y, z的坐标必须在[-1.0, 1.0]之间,超出范围的片元(目前可以把片元理解为像素)会被剪切掉,不会显示。Z轴这里不讨论,先讨论x, y轴。例子中x, y数据具体与绘制窗口(视口viewport)对应如下,窗口中心为(0,0)点:

 

例子中绘制了两个三角形,三角形的数据如下:

         GLfloat  vertices[NumVertices][2] = {

                   {-0.9f,-0.9f},

                   {0.85f,-0.90f},

                   {-0.90f,0.85f},

                   {0.90f,-0.85f},

                   {0.90f,0.90f},

                   {-0.85f,0.90f} };

三角形1的数据为(0.90, -0.85), (0.90, 0.90), (-0.85, 0.90)

三角形2的数据为(-0.9,-0.9), (0.85,-0.90), (-0.90, 0.85)

 

顶点着色器

例子中有6个顶点数据,所以每次渲染会执行6次顶点着色器,每个顶点执行一次。

 

片元着色器

片元着色器执行次数与两个三角形覆盖的片元(像素)个数有关,每个片元会执行一次,肯定远大于6次。

 

着色器程序都是在显卡中执行,显卡一般都几百上千个处理单元,可以同时并行执行一个过程的着色器程序,所以不用担心顶点和片元着色器的速度问题。

 

 

 

OpenGL图形系统是一个软件接口 让程序员能够创建交互式程序 使用计算机图形学技术生成具有真实感的图像 本书是OpenGL ARB推荐的OpenGL 1 4版学习指南 本书首先阐述OpenGL的功能和计算机图形学基本知识 包括状态管理和几何体的绘制 模型变换 视点变换和投影变换 颜色和光照;然后深入探讨一些高级技术 包括反走样 雾阄 显示列表 图像处理 纹理映射 帧缓存 网格化 NURBS 选择和反馈等;同时讨论其他一些重要主题 像如何提高程序的性能 OpenGL扩展和跨平台技术等 本书只要求读者有一定的C语言基础和数学知识 适合所有对OpenGL编程感兴趣的读者阅读 OpenGL是一个功能强大的软件接口 用于绘制高质量的计算机图像 以及编写使用2D和3D几何物体及位图和图像的交互式应用程序 本书介绍OpenGLOpenGL实用库 内容全面 权威 被称为“OpenGL红宝书” 本书第三版针对的是OpenGL1.2版 而本版介绍了OpenGL1.3和1.4版新增的所有特性以及重要的OpenGL ARB OpenGL体系结构审核委员会 扩展 本书以清晰的语言阐述了OpenGL的功能以及众多计算机图形学基本技术 如构建和渲染3D模型 从不同的角度观察物体 使用着色 光照和纹理映射来提高图像的真实感;深入探讨了一些高级技术 其中包括纹理映射 反走样 雾效和大气效果 NURBS 图像处理等;讨论了其他一些重要主题 如提高性能 OpenGL扩展和跨平台技术等 ">OpenGL图形系统是一个软件接口 让程序员能够创建交互式程序 使用计算机图形学技术生成具有真实感的图像 本书是OpenGL ARB推荐的OpenGL 1 4版学习指南 本书首先阐述OpenGL的功能和计算机图形学基本知识 包括状态管理和几何 [更多]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值