本节书摘来自华章出版社《OpenGL编程指南》一书中的第1章,第1.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.2 初识OpenGL程序

正因为可以用OpenGL去做那么多的事情,所以OpenGL程序有可能会写得非常庞大和复杂。不过,所有OpenGL程序的基本结构通常都是类似的,其步骤如下:
初始化物体渲染所对应的状态。
设置需要渲染的物体。
在阅读代码之前,我们有必要了解一些最常用的图形学名词。渲染(render)这个词在前文中已经多次出现,它表示计算机从模型创建最终图像的过程。OpenGL只是其中一种渲染系统,除此之外,还有很多其他的渲染系统。OpenGL是基于光栅化的系统,但是也有别的方法用于生成图像。例如光线跟踪(ray tracing),而这类技术已经超出了本书的介绍范围。不过,就算是用到了光线跟踪技术的系统,同样有可能需要用到OpenGL来显示图像,或者计算图像生成所需的信息。
模型(model),或者场景对象(我们会交替地使用这两个名词)是通过几何图元,例如点、线和三角形来构建的,而图元与模型的顶点(vertex)也存在着各种对应的关系。
OpenGL另一个最本质的概念叫做着色器,它是图形硬件设备所执行的一类特殊函数。理解着色器最好的方法是把它看做专为图形处理单元(通常也叫做GPU)编译的一种小型程序。OpenGL在其内部包含了所有的编译器工具,可以直接从着色器源代码创建GPU所需的编译代码并执行。在OpenGL中,会用到四种不同的着色阶段(shader stage)。其中最常用的包括的顶点着色器(vertex shader)以及片元着色器,前者用于处理顶点数据,后者用于处理光栅化后的片元数据。所有的OpenGL程序都需要用到这两类着色器。

最终生成的图像包含了屏幕上绘制的所有像素点。像素(pixel)是显示器上最小的可见单元。计算机系统将所有的像素保存到帧缓存(framebuffer)当中,后者是由图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。
图1-1所示为一个简单的OpenGL程序的输出结果,它在一个窗口中渲染了两个蓝色的三角形。这个例子的完整源代码如例1.1所示。
例1.1  第一个OpenGL程序triangles.cpp



也许你会觉得这里的代码有点多,不过它的确就是几乎每一个OpenGL程序所必需的基本内容了。我们用到了不属于OpenGL正式部分的一些第三方软件库,以便实现一些简单的工作,例如创建窗口、接收鼠标和键盘输入等—OpenGL自身并不包含这些功能。我们还创建了一些辅助函数和简单的C++类来简化示例程序的编写。尽管OpenGL是一个C语言形式的库,但是本书中的所有示例都会使用C++来编写,但只是非常简单的C++。事实上,我们用到的绝大部分C++代码是用来实现一些数学向量和构建矩阵的。
简单来说,下面列出的就是例1.1做的所有事情。不过不用担心,后面的章节会更详细地解释这些概念。
在程序的起始部分,我们包含了必要的头文件并且声明了一些全局变量和其他有用的编程结构。
init()函数负责设置程序中需要用到的数据。它可能是渲染图元时用到的顶点信息,或者用于执行纹理映射(texture mapping)的图像数据,第6章会介绍这一技术。
在这个init()函数中,首先指定了两个被渲染的三角形的位置信息。然后指定了程序中使用的着色器。在这个示例中,我们只需要使用顶点和片元着色器。这里的LoadShaders()是我们为着色器进入GPU的操作专门实现的函数。第2章会详细介绍与它相关的内容。
init()函数的最后一部分叫做着色管线装配(shader plumbing),也就是将应用程序的数据与着色器程序的变量关联起来。同样会在第2章详细介绍这一部分的内容。
display()函数真正执行了渲染的工作。也就是说,它负责调用OpenGL函数并渲染需要的内容。几乎所有的display()函数都要完成类似这个简单示例中的三个步骤。
1)调用glClear()来清除窗口内容。
2)调用OpenGL命令来渲染对象。
3)将最终图像输出到屏幕。
最后,main()函数执行了创建窗口、调用init()以及最终进入事件循环体系的一系列繁重工作。这里你也会看到一些以gl开头的函数,但是它们看起来和其他的函数又有一些不同。这些函数就是刚才所说的来自第三方库GLUT和GLEW的函数,我们会随时使用它们来快速完成一些简单的功能,并且保证OpenGL程序可以运行在不同的操作系统和窗口系统上。
在深入了解这些函数之前,我们有必要先解释一下OpenGL的函数、常量的命名方式,以及一些有用的编程结构。

《OpenGL编程指南》一1.2 初识OpenGL程序相关推荐

  1. OpenGL编程指南3:GLUT:OpenGL使用工具库

    1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...

  2. 《OpenGL编程指南》一第2章 着色器基础

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...

  3. OpenGL编程指南7:视图-

    1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...

  4. OpenGL编程指南5:学习绘制不同风格的曲线

    1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...

  5. OpenGL编程指南4:双缓冲实现运行

    1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...

  6. opengl编程指南第8版源码编译详细说明

    1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...

  7. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  8. 《OpenGL编程指南》一第3章 OpenGL绘制方式

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...

  9. 《OpenGL编程指南》一3.2 OpenGL缓存数据

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...

  10. OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结

    弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...

最新文章

  1. Laravel: 基础篇
  2. java arraylist的初始化和数组的相互转化
  3. php mysql curd_Php mysql 常用代码、CURD操作以及简单查询
  4. 云原生背景运维转型之 SRE 实践
  5. 如何快速编写并运行Tiny模板语言?
  6. 计算机专业去荷兰还是瑞典,给申请计算机专业的同学几点建议
  7. 计算机考研英语什么时候考试,计算机考研:早期复习三大注意事项
  8. 自动分页,返回时跳回指定页
  9. wamp怎么安装mysql服务器_用wamp的mysq安装pythonmysql
  10. 前端开发 页面跳转练习 0228未完成
  11. IntelliJ IDEA开发入门教程
  12. [11]2020-CVPR-State-Relabeling Adversarial Active Learning论文笔记
  13. 关于单位申请进京指标
  14. 动名词到底什么时候才用? ———— 英语菜鸟最后的倔强!
  15. [AHK]新浪实时股票数据接口
  16. Windows超级管理器 8.72 这一刻,刻不容缓。
  17. 电瓶车罚款不交后果如何
  18. am5728 中断的使用
  19. 亚马逊测评自养号,小白应该如何开始?
  20. Qt TCP/IP语音

热门文章

  1. 216.组合总和III
  2. 52. N皇后 II
  3. js中立即执行函数会预编译吗_javascript引擎执行的过程的理解--执行阶段
  4. 什么是document对象?如何获取文档对象上的元素?_JavaScript DOM操作元素的方法,你还记得多少?...
  5. rmd中无法打开链结r_小编详解 win7系统无法访问网络打印机的修复教程 -win7系统使用教程...
  6. struts1、 struts2所有版本jar包下载地址大全
  7. 为什么选择红黑树作为底层实现
  8. 目标追踪论文之狼吞虎咽(2):在线被动攻击学习
  9. 操作系统课设 Nachos 实验一:Nachos 系统的安装与调试
  10. 【2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)】Justified Jungle【树上思维题】