《OpenGL编程指南》一2.7 独立的着色器对象

2.7 独立的着色器对象

高级技巧
在OpenGL 4.1版本之前(不考虑扩展功能),在应用程序中,同一时间只能绑定一个着色器程序。如果你的程序需要使用多个片元着色器来处理来自同一个顶点着色器的几何体变换数据,那么这样会变得很不方便。此时只能将同一个顶点着色器复制多份,并且多次绑定到不同的着色器程序,从而造成了资源的浪费和代码的重复。
独立的着色器对象可以将不同程序的着色阶段(例如顶点着色)合并到同一个程序管线中。
第一步,我们需要创建用于着色器管线的着色器程序。我们可以调用glProgramParameteri()函数并且设置参数为GL_PROGRAM_SEPARABLE,然后再链接着色器程序。这样该程序就被标识为在程序管线中使用。如果想要简化这个过程,还可以直接使用新增的glCreateShaderProgramv()来封装着色器编译过程,并且将程序标识为可共享(如上文所述),然后链接到最终的对象。
将着色器程序集合合并之后,就需要用这个新的着色器管线结构来合并多个程序中的着色阶段。对于OpenGL中的大部分对象来说,都有一个生成-绑定-删除的过程,以及对应可用的函数。着色器管线的创建可以调用glGenProgramPipelines(),即创建一个未使用的程序管线标识符,然后将它传入glBindProgramPipeline(),使得该程序可以自由编辑(例如,添加或者替换着色阶段)和使用。与其他生成的对象相似,程序管线可以通过glDeleteProgramPipelines()来删除。
当绑定了一个程序管线之后,可以调用glUseProgramStages()将之前标记为独立的程序对象关联到管线上,它通过位域的方式来描述该管线处理几何体和着色片元时,给定程序所处的着色阶段。而之前的glUseProgram()只能直接调用一个程序并且替换当前绑定的程序管线。
为了确保管线可以使用,着色器阶段之间的接口—in和out变量—也必须是匹配的。非独立的着色器对象在程序链接时就可以检查这些接口的匹配情况,与之相比,使用独立程序对象的着色器管线只能在绘制–调用过程中进行检查。如果接口没有正确匹配,那么所有的可变变量(out变量)都未定义。
内置的gl_PerVertex块必须重新声明,以便显式地指定固定管线接口中的哪些部分可以使用。如果管线用到了多个程序,那么这一步是必需的。
例如:

这样我们就建立了着色器的输出接口,它将用于后继的管线阶段当中。这里必须使用gl_PerVertex自己的内置成员。如果不同的着色器程序都用到了同一个内置的块接口,那么所有的着色器都必须使用相同的方式重新声明这个内置的块。
因为独立的着色器对象可以有各自独立的程序uniform集合,所以我们可以使用两种方法来设置uniform变量的值。第一种方法是通过glActiveShaderProgram()来选择一个活动的着色器程序,然后调用glUniform()和glUniformMatrix()来设置某个着色器程序的uniform变量的值。另一种方法,也是我们推荐的方法,是调用glProgramUniform()和glProgramUniformMatrix()函数,它们有一个显式的program对象参数,这样可以独立地设置某个程序的uniform变量的值。
void glProgramUniform{1234}{fdi ui}(GLuint program, GLint location, TYPE value);
void glProgramUniform{1234}{fdi ui}v(GLuint program, GLint location, GLsizei count, const TYPE* values);
void glProgramUniformMatrix{234}{fd}v(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* values);
void glProgramUniformMatrix{2x3,2x4,3x2,3x4,4x2,4x3}{fd}v( GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* values);
glProgramUniform()和glProgramUniformMatrix()函数的使用与glUniform()和glUniformMatrix()的使用是一样的,唯一的区别是使用一个program参数来设置准备更新uniform变量的着色器程序。这些函数的主要优点是,program可以不是当前绑定的程序(即最后一个使用glUseProgram()指定的着色器程序)。

时间: 2024-09-27 17:59:49

《OpenGL编程指南》一2.7 独立的着色器对象的相关文章

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

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

《OpenGL编程指南》一2.1 着色器与OpenGL

2.1 着色器与OpenGL 现代OpenGL渲染管线严重依赖着色器来处理传入的数据.如果不使用着色器,那么用OpenGL可以做到的事情可能只有清除窗口内容了,可见着色器对于OpenGL的重要性.在OpenGL 3.0版本以前(含该版本),或者如果你用到了兼容模式(compatibility profile)环境,OpenGL还包含一个固定功能管线(fixed-function pipeline),它可以在不使用着色器的情况下处理几何与像素数据.从3.1版本开始,固定功能管线从核心模式中去除,因

《OpenGL编程指南》一2.6 着色器子程序

2.6 着色器子程序 高级技巧GLSL允许我们在着色器中定义函数,而这些函数的调用过程总是静态的.如果需要动态地选择调用不同的函数,那么可以创建两个不同的着色器,或者使用if语句来进行运行时的选择,如例2.5所示.例2.5 静态着色器的控制流程 着色器子程序在概念上类似于C语言中的函数指针,它可以实现动态子程序选择过程.在着色器当中,可以预先声明一个可用子程序的集合,然后动态地指定子程序的类型.然后,通过设置一个子程序的uniform变量,从预设的子程序中选择一个并加以执行. 2.6.1 GLS

《OpenGL编程指南(原书第9版)》——2.7 独立的着色器对象

2.7 独立的着色器对象 高级技巧 在OpenGL 4.1版本之前(不考虑扩展功能),在应用程序中,同一时间只能绑定一个着色器程序.如果你的程序需要使用多个片元着色器来处理来自同一个顶点着色器的几何体变换数据,那么这样会变得很不方便.此时只能将同一个顶点着色器复制多份,并且多次绑定到不同的着色器程序,从而造成了资源的浪费和代码的重复. 独立的着色器对象可以将不同程序的着色阶段(例如顶点着色)合并到同一个程序管线中. 第一步,我们需要创建用于着色器管线的着色器程序.我们可以调用glProgramP

《OpenGL编程指南(原书第9版)》——导读

前言 OpenGL图形系统是图形硬件的一种软件接口(GL表示Graphics Library,即图形库).它使得用户可以创建交互式的程序以产生运动的三维对象的颜色图像.通过OpenGL,我们可以使用计算机图形学技术产生逼真的图像,或者通过一些虚构的方式产生虚拟的图像.这本指南将告诉你如何使用OpenGL图形系统进行编程,得到你所期望的视觉效果. 本书的主要内容 本书中包含以下章节: 第1章对OpenGL可以完成的工作进行了概览.它还提供了一个简单的OpenGL程序并解释了一些本质性的编程细节,它

《OpenGL编程指南》一导读

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

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

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

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

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

《OpenGL编程指南(原书第9版)》——2.2 OpenGL的可编程管线

2.2 OpenGL的可编程管线 第1章已经对OpenGL的渲染管线进行了一个概要的介绍,其中我们简述了着色器自身的运行机制,但是并没有讲解第一个例子当中所用到的简单着色器代码的含义.现在将更加详细地介绍它的每个阶段以及其中所承载的工作.4.5版本的图形管线有4个处理阶段,还有1个通用计算阶段,每个阶段都需要由一个专门的着色器进行控制. 1)顶点着色阶段(vertex shading stage)将接收你在顶点缓存对象中给出的顶点数据,独立处理每个顶点.这个阶段对于所有的OpenGL程序都是唯一