《OpenGL编程指南》一2.2 OpenGL的可编程管线

2.2 OpenGL的可编程管线

在第1章已经对OpenGL的渲染管线进行了一个概要的介绍,现在将更加详细地介绍它的每个阶段以及其中所承载的工作。4.3版本的图形管线有4个处理阶段,还有1个通用计算阶段,每个阶段都需要由一个专门的着色器进行控制。
1)顶点着色阶段(vertex shading stage)将接收你在顶点缓存对象中给出的顶点数据,独立处理每个顶点。这个阶段对于所有的OpenGL程序都是必需的,并且必须绑定一个着色器。第3章将对顶点着色的操作进行介绍。
2)细分着色阶段(tessellation shading stage)是一个可选的阶段,与应用程序中显式地指定几何图元的方法不同,它会在OpenGL管线内部生成新的几何体。这个阶段启用之后,会收到来自顶点着色阶段的输出数据,并且对收到的顶点进行进一步的处理。第9章会介绍细分着色阶段的内容。
3)几何着色阶段(geometry shading stage)也是一个可选的阶段,它会在OpenGL管线内部对所有几何图元进行修改。这个阶段会作用于每个独立的几何图元。此时你可以选择从输入图元生成更多的几何体,改变几何图元的类型(例如将三角形转化为线段),或者放弃所有的几何体。如果这个阶段被启用,那么几何着色阶段的输入可能会来自顶点着色阶段完成几何图元的顶点处理之后,也可能来自细分着色阶段生成的图元数据(如果它也被启用)。第10章会介绍几何着色阶段的内容。
4)OpenGL着色管线的最后一个部分是片元着色阶段(Fragment shading stage)。这个阶段会处理OpenGL光栅化之后生成的独立片元(如果启用了采样着色的模式,就是采样数据),并且这个阶段也必须绑定一个着色器。在这个阶段中,计算一个片元的颜色和深度值,然后传递到管线的片元测试和混合的模块。片元着色阶段的介绍将会贯穿本书的很多章节。
5)计算着色阶段(Compute shading stage)和上述阶段不同,它并不是图形管线的一部分,而是在程序中相对独立的一个阶段。计算着色阶段处理的并不是顶点和片元这类图形数据,而是应用程序给定范围的内容。计算着色器在应用程序中可以处理其他着色器程序所创建和使用的缓存数据。这其中也包括帧缓存的后处理效果,或者我们所期望的任何事物。计算着色器的介绍参见第12章。
现在我们需要大概了解一个重要的概念,就是着色阶段之间数据传输的方式。正如在第1章中看到的,着色器类似一个函数调用的方式—数据传输进来,经过处理,然后再传输出去。例如,在C语言中,这一过程可以通过全局变量,或者函数参数来完成。GLSL与之稍有差异。每个着色器看起来都像是一个完整的C程序,它的输入点就是一个名为main()的函数。但与C不同的是,GLSL的main()函数没有任何参数,在某个着色阶段中输入和输出的所有数据都是通过着色器中的特殊全局变量来传递的(请不要将它们与应用程序中的全局变量相混淆—着色器变量与你在应用程序代码中声明的变量是完全不相干的)。例如,下面的例2.1中的内容。
例2.1 一个简单的顶点着色器

虽然这是一个非常短的着色器,但是还是有许多需要注意的地方。我们先不考虑自己需要对哪个着色阶段进行编程,所有常见的着色器代码都应该与这个例子有着相同的结构。在程序起始的位置总是要使用#version来声明所使用的版本。
首先,应注意这些全局变量。OpenGL会使用输入和输出变量来传输着色器所需的数据。除了每个变量都有一个类型之外(例如vec4,后文将深入地进行介绍),OpenGL还定义了in变量将数据拷贝到着色器中,以及out变量将着色器的内容拷贝出去。这些变量的值会在OpenGL每次执行着色器的时候更新(如果OpenGL处理的是顶点,那么这里会为每个顶点传递新的值;如果是处理片元,那么将为每个片元传递新值)。另一类变量是直接从OpenGL应用程序中接收数据的,称作uniform变量。uniform变量不会随着顶点或者片元的变化而变化,它对于所有的几何体图元的值都是一样的,除非应用程序对它进行了更新。

时间: 2024-09-14 05:39:46

《OpenGL编程指南》一2.2 OpenGL的可编程管线的相关文章

《高质量C++C编程指南》纠错与拾遗(一)

使用C++/C编程的程序员,几乎都看过林锐博士写的<高质量C++C编程指南>这篇百页经书,并且通过阅读这篇百页经书,受益匪浅.我也是这篇文章的受益者.通过这篇百页经书,我学到很多知识,也给于了我深入学习C++的动力. 最近,偶得机会,再次拜读林锐博士的<高质量C++C编程指南>,发现里面有些观点颇有争议,本文作者对这些观点进行的了考证,整理,汇总,形成了此文档,这里绝无批驳,贬低<高质量C++C编程指南>之意,其目的有二,一:阐述本文作者对<高质量C++C编程指南

《opengl编程指南》第八版 例题都不能编译运行

问题描述 <opengl编程指南>第八版 例题都不能编译运行 所有例题都出现下面这几个错误.好像是库的问题,但不知道那个库,该怎么办 解决方案 1>------ 已启动生成: 项目: Triangles, 配置: Debug Win32 ------ 1>freeglut_static_vs2010_d.lib(freeglut_init.obj) : error LNK2019: 无法解析的外部符号 sscanf,该符号在函数 _glutInit 中被引用 1>freegl

OpenGL ES 2.0编程指南中文版.

OpenGL ES 2.0编程指南中文版 http://download.csdn.net/detail/matrixhero/4962021

《OpenGL编程指南》一导读

前言 Preface OpenGL图形系统是图形硬件的一种软件接口(GL表示Graphics Library,即图形库).它使得用户可以创建交互式的程序以产生运动的3维对象的颜色图像.通过OpenGL,我们可以使用计算机图形学技术来产生逼真的图像,或者通过一些虚构的方式产生虚拟的图像.这本指南将告诉你如何使用OpenGL图形系统进行编程,得到你所期望的视觉效果. 目 录 第1章 OpenGL概述1.1 什么是OpenGL1.2 初识OpenGL程序 1.3 OpenGL语法1.4 OpenGL渲

《OpenGL编程指南(原书第9版)》——1.2 初识OpenGL程序

1.2 初识OpenGL程序 正因为可以用OpenGL去做那么多的事情,所以OpenGL程序有可能会写得非常庞大和复杂.不过,所有OpenGL程序的基本结构通常都是类似的: 1.?初始化物体渲染所对应的状态. 2.?设置需要渲染的物体. 在阅读代码之前,我们有必要了解一些最常用的图形学名词.渲染(render)这个词在前文中已经多次出现,它表示计算机从模型创建最终图像的过程.OpenGL只是其中一种渲染系统,除此之外,还有很多其他的渲染系统.OpenGL是基于光栅化的系统,但是也有别的方法用于生

《OpenGL编程指南(原书第9版)》——1.5 第一个程序:深入分析

1.5 第一个程序:深入分析 现在我们来深入探讨一下之前的第一个程序.1.5.1 进入main()函数 为了了解示例程序从一开始是如何运行的,首先了解一下main()函数当中都发生了什么.前面的6行使用GLFW设置和打开了一个渲染用的窗口.这方面的详细介绍可以参见附录A,这里只介绍每一行的执行结果. 第一个函数glfwtInit()负责初始化GLFW库.它会处理向程序输入的命令行参数,并且移除其中与控制GLFW如何操作相关的部分(例如设置窗口的大小).glfwtInit()必须是应用程序调用的第

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

第2章 着色器基础 本章目标阅读完本章内容之后,你将会具备以下能力:区分OpenGL创建图像所用的不同类型的着色器.使用OpenGL着色语言构建和编译着色器.使用OpenGL中提供的多种机制将数据传入着色器.使用高级GLSL着色技巧来创建可复用性更强的着色器.本章将介绍如何在OpenGL中使用可编程着色器(shader).首先介绍OpenGL着色语言(OpenGL Shading Language,通常也称作GLSL),然后详细解释着色器将如何与OpenGL应用程序交互.这一章将会包含以下几节:

《OpenGL编程指南》一1.2 初识OpenGL程序

1.2 初识OpenGL程序 正因为可以用OpenGL去做那么多的事情,所以OpenGL程序有可能会写得非常庞大和复杂.不过,所有OpenGL程序的基本结构通常都是类似的,其步骤如下:初始化物体渲染所对应的状态.设置需要渲染的物体.在阅读代码之前,我们有必要了解一些最常用的图形学名词.渲染(render)这个词在前文中已经多次出现,它表示计算机从模型创建最终图像的过程.OpenGL只是其中一种渲染系统,除此之外,还有很多其他的渲染系统.OpenGL是基于光栅化的系统,但是也有别的方法用于生成图像

《OpenGL编程指南(原书第9版)》——3.2 OpenGL缓存数据

3.2 OpenGL缓存数据 几乎所有使用OpenGL完成的事情都用到了缓存buffers中的数据中.OpenGL的缓存表示为缓存对象(buffer object).第1章已经简要地介绍了缓存对象的意义.不过,这一节将稍微深入到缓存对象的方方面面当中,包括它的种类.创建方式.管理和销毁,以及与缓存对象有关的一些最优解决方案.3.2.1 创建与分配缓存 与OpenGL中的很多其他实现类似,缓存对象也是使用GLuint的值来进行命名的.这个值可以使用glCreateBuffers()命令来创建.我们

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

3.2 OpenGL缓存数据 几乎所有使用OpenGL完成的事情都用到了缓存buffers中的数据中.OpenGL的缓存表示为缓存对象(buffer object).在第1章里我们已经简要地介绍了缓存对象的意义.不过,这一节将稍微深入到缓存对象的方方面面当中,包括它的种类.创建方式.管理和销毁,以及与缓存对象有关的一些最优解决方案. 3.2.1 创建与分配缓存 与OpenGL中的很多其他实现类似,缓存对象也是使用GLuint的值来进行命名的.这个值可以使用glGenBuffers()命令来创建.