第一章 OpenGL 概述

OpenGL 流程:顶点数据 ==》顶点着色器 ==》图元装配 ==》光栅化 ==》 片段着色器 ==》混合测试 ==》输出到屏幕。

顶点数据可以看成应用程序阶段,顶点数据可以是,模型(model),一个三维场景 (Scene)。

从顶点数据到顶点着色器包括了数据怎么发送到 GPU 的内存,需要向 OpenGL 解释数据的内存布局,比如代表顶点,向量,颜色等等的数据需要在应用程序阶段解释给 OpenGL 。方便 OpenGL 去执行,到顶点着色器。顶点着色器输出的数据给到图元装配一般会有线性插值,在装配图元的时候会产生插值。这就可以解释三角形色盘现象。线性插值。

在 OpenGL 中,有两个着色器是必须要的,顶点着色器,片段着色器。

可以这么理解:OpenGL 程序可以当成客户端,通过特殊的传递信息到服务器,服务器可以粗略的看成操作系统中处理图形的硬件,显卡。关于显示的数据,为什么会显示,显示的数据是什么,framebuffer。一块存储在显存中的数据块,这个就是显示的内容,显示器映射到显卡的一块区域。

当我们缓存完毕就可以去调用 OpenGL 绘制命令去绘制对应的图元。glDrawArrays() 这个是不带索引的绘制,这是一条最基础的绘制命令。

顶点着色器和细分着色器以及几何着色器决定了一个图元位于屏幕的什么位置,而片段着色器使用这些信息来决定某一个片段是什么颜色。

逐片段操作,深度测试和模板测试这两个测试来决定一个片段时候应该显示,所以说,在经历过片段着色器之后还不一定是最终的颜色,还需要经历深度测试和模板测试。才能决定最终的颜色。换句话说当一个片段经历国所有测试且成功通过,那么将会被 OpenGL 的缓冲区采纳,将会被加入到帧缓冲里面。

具体细节

  1. 我们会发现很多 OpenGL 命令都是 glCreate* 的形式,它们负责分配不同类型的OpenGL对象的名称。这里的名称类似 C 语言中的一个指针变量,我们可以分配内存对象并且用名称引用它。当我们得到对象之后,可以将它绑定 (bind) 到 OpenGL 环境以便使用。在这个例子中,我们通过 glBindVertexArray() 函数创建并且绑定了一个顶点数组对象。
  2. 这个例子中,在生成一个顶点数组对象之后,就会使用 glBindVertexArray() 将它绑定起来。在 OpenGL中这样的对象绑定操作非常常见,但是我们可能无法立即了解它做了什么。当我们绑定对象时(例如,用指定的对象名作为参数调用 glBind*() ),OpenGL 内部会将它作为当前对象,即所有后继的操作都会作用于这个被绑定的对象,例如,这里的顶点数组对象的状态就会被后面执行的代码所改变。在第一次调用 glCreate*() 函数之后,新创建的对象都会初始化为其默认状态,而我们通常需要一些额外的初始化工作来确保这个对象可用。
    绑定对象的过程有点类似设置铁路的道岔开关。一旦设置了开关,从这条线路通过的所有列车都会驶向对应的轨道。如果我们将开关设置到另一个状态,那么所有之后经过的列车都会驶向另一条轨道。OpenGL 的对象也是如此。总体上来说,在两种情况下我们需要绑定一个对象:创建对象并初始化它所对应的数据时;以及每次我们准备使用这个对象,而它并不是当前绑定的对象时。我们会在display() 例程中看到后一种情况,即在程序运行过程中第二次调用 glBindVertexArray() 函数。由于示例程序需要尽量短小,因此我们不打算做任何多余的操作。举例来说,在较大的程序里当我们完成对顶点数组对象的操作之后,是可以调用 glDeleteVertexArrays() 将它释放的。

OpenGL 如果需要使用一个对象,那么必须先创建对象,然后绑定到 OpenGL 环境中。

顶点数组对象负责保存一系列顶点的数据。这些数据保存到缓存对象当中,并且由当前绑定的顶点数组对象管理。我们只有一种顶点数组对象类型,但是却有很多种类型的对象,并且其中一部分对象并不负责处理顶点数据。正如前文中所提到的,缓存对象就是OpenGL服务端分配和管理的一块内存区域,并且几乎所有传入OpenGL 的数据都是存储在缓存对象当中的。

缓存对象的初始化过程与顶点数组对象的创建过程类似,不过需要有向缓存中添加数据的一个过程。

当分配缓存之后、就可以调用glBindBuffer()来绑定它们到 OpenGL 环境了。由于 OpenGL 中有很多种不同类型的缓存对象,因此绑定一个缓存时,需要指定它所对应的类型。在这个例子中,由于是将顶点数据保存到缓存当中,因此使用 GL_ARRAY_BUFFER 类型。而绑定缓存的类型也称作绑定目标( binding target)。缓存对象的类型现在有很多种,它们用于不同的 OpenGL 功能实现。本书后面的章节会分别讨论各种类型的对应操作。

GLSL

最后的字段是layout (location = 0),它也叫做布局限定符( layout qualifier),目的是为变量提供元数据( meta data)。我们可以使用布局限定符来设置很多不同的

显而易见vPosition就是变量的名称。我们使用一个字符“v”作为这个顶点属性名称的前缀。这个变量所保存的是顶点的位置信息。

OpenGL 编程指南 ( 原书第 9 版 ) --- 第一章相关推荐

  1. ROS机器人高效编程(原书第3版)勘误、问题及资料汇总

    ROS机器人高效编程(原书第3版)勘误.问题及资料汇总--持续更新 如果小伙伴发现书中错误,恳请批评指正,非常感谢.勘误在文末. 补充一行代码装ROS,适用于14.04LTS(indigo)和16.0 ...

  2. python 网络编程_Python网络编程(原书第2版)

    Python网络编程(原书第2版) 作者:(美)埃里克·周(Eric Chou) 著 出版日期:2019年06月 文件大小:54.50M 支持设备: ¥68.00 适用客户端: 言商书局 iPad/i ...

  3. OpenGL与红宝书第八版第一个程序配置

    本文档参考文献为<OpenGL编程指南>(原书第8版)中文版. 下面直接讲解笔者接触并初学OpenGL之路. 由于笔者学习方向的关系,有时接触到某些开源框架的时候,里面涉及到OpenGL. ...

  4. JavaScript权威指南(原书第7版) 犀牛书

    第3章 语法结构 3.10.1 使用let和const声明 ES6后,变量通过let关键字声明 let i let sum 可以使用一条let语句声明多个变量 let i, sum 声明变量的同时,( ...

  5. Java语言程序设计基础篇原书第十版第二章编程练习题答案

    程序如有问题,及时联系博主哦~博主会贴出所有带有星号的题目,以及一些典型的例子,希望能够帮助到同学们,也希望同学们都学好java语言. 2.1将摄氏温度转换为华氏温度 package nameyu;i ...

  6. OpenGL编程指南2:环境搭配与第一个实例剖析

    1.环境配置 1.1 OpenGL与Windows操作系统有什么关系? OpenGL是一种应用程序编程接口(API),也是一种可以对图形硬件设备特性进行访问的软件库.因而事实上,OpenGL其实与显卡 ...

  7. 差错控制编码(原书第2版)/shu lin/daniel j.costello/jr

    <差错控制编码>(原书第2版)在第一版的基础上进行了彻底的修订和更新.包括了过去20年间该领域所有的重要新发展.<差错控制编码>(原书第2版)增加了线性分组码的网格.基于可靠性 ...

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

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

  9. OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器

    转载自 <OpenGL编程指南(原书第8版)>--计算着色器 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件.过去,这种处理器主要被设计用于承担实时图形渲 ...

  10. 苹果开发之Cocoa编程(原书第4版)

    <苹果开发之Cocoa编程(原书第4版)> 基本信息 原书名:Cocoa Programming for Mac OS X: Fourth Edition 作者: (美)希莱加斯(Hill ...

最新文章

  1. LeetCode hard 84. Largest Rectangle in Histogram--python,java 15行,c++ 15行 解法
  2. leetcode 740. Delete and Earn | 740. 删除并获得点数(暴力递归->傻缓存->DP)
  3. mysql配置环境变量(win 10)_mysql配置环境变量(win 10)
  4. 算法中的算子是什么意思,图像处理一样理解
  5. ado控件连接mysql_VB利用ADO控件连接access数据库
  6. 数据恢复关键技术与实战指南
  7. 91卫图助手下载器永久免费啦
  8. kettle连接oracle汉字乱码
  9. ASO优化含义篇:积分墙是什么?
  10. 计算机系的学生的未来计划,学生未来计划.doc
  11. sre8 sre10_透过窥视镜:安全性和SRE
  12. OHS 12C中导入第三方SSL证书
  13. C语言负整数在内存中的存储
  14. 西门子plc怎样实现远程调试、远程上下载程序?
  15. WebRTC源码研究(4)web服务器工作原理和常用协议基础
  16. 常见点击反应(Click Reactions)及其试剂——CuAAC
  17. 阿里研究院启动2017年度淘宝村辅助认证活动(附表格下载)
  18. linux+查内存数量,检查 Linux 中内存使用情况的 8 条命令 | Linux 中国
  19. kali2.0 mysql_kali linux2.0下MariaDB修改密码
  20. 用Python爬取王冰冰vlog弹幕并制作词云

热门文章

  1. 从极速号码魔方软件中获取手机号码的城市号段归属地数据
  2. VassistX的简单介绍与下载安装
  3. 中国水电基础局携手友勤开展2018年P6软件培训班
  4. Sql Server数据库查询去重数据,并保留最新的数据,以及删除重复数据
  5. 泊车——prescan
  6. vivado软件安装教程
  7. Cozmo机器人使用中文Scratch3编程案例(codelab)
  8. exe反编译为py文件
  9. Java速成课程建议
  10. 【Python】使用Labelme标注自己的数据集并由json生成Ground Truth