OpenGL程序管线对象 Program Pipeline Objects

本文详细阐述了OpenGL中的程序管线对象,包括如何组合和管理不同类型的着色器阶段,以及如何通过glUseProgramStages、glActiveShaderProgram等函数进行着色器阶段的绑定和激活。还介绍了程序二进制文件的获取与加载机制,以提高程序性能和加载效率。

OpenGL程序管线对象 Program Pipeline Objects

在OpenGL中,为了实现更灵活的着色器组合和管理,可以将不同类型的着色器阶段分别封装到多个程序对象中,而不是全部打包在一个单一的程序对象内。一个程序对象可能仅包含一个或部分完整的管线所需的着色器阶段,这样就可以根据需要以各种方式组合不同的着色器,而无需为每种组合创建一个新的程序对象。

程序管线对象(program pipeline object)是用来容纳所有着色器类型与各自对应程序对象绑定关系的容器。通过这种方式,可以指定每个着色器阶段(如顶点着色器、片段着色器等)所对应的程序对象。

  1. 无当前着色器程序时
    如果没有通过 glUseProgram 函数设置当前的着色器程序,那么渲染管线会自动从已绑定的程序管线对象(如果有)获取各个着色器阶段所使用的着色器程序和 uniform 更新的相关信息。这意味着在没有明确指定单个着色器程序的情况下,整个渲染流程将按照程序管线中预配置的状态进行。

  2. 有当前着色器程序时
    当通过 glUseProgram 设置了一个当前的着色器程序,那么无论是否有绑定的程序管线对象,渲染过程以及 uniform 更新都将只根据这个当前激活的着色器程序来执行。此时,即使存在已绑定的管线对象,它对渲染行为和 uniform 更新也无效。

  3. 使用绑定的程序管线对象渲染
    当确实要利用一个已绑定的程序管线对象进行渲染时,管线中的各个着色器阶段(如顶点着色器、几何着色器、片段着色器等)对应的可执行代码将分别从管线内关联的各个独立着色器程序中提取出来。这一点与直接使用 glUseProgram 指定单一着色器程序不同,管线允许组合多个着色器程序,并且可以预设它们之间的状态切换关系,以实现更灵活高效的渲染流程管理。在OpenGL规范的7.3章节关于 glUseProgram 的讨论中对此有详细说明。


void glGenProgramPipelines( sizei n, uint *pipelines );

生成并返回未使用的n个程序管线对象名称,并将其存储在 pipelines 指向的数组中。这些新生成的名称将被标记为已使用,但它们只有在首次绑定时才会获得具体的状态信息。


void glDeleteProgramPipelines( sizei n, const uint *pipelines );

当调用此函数时,OpenGL 将删除由 pipelines 数组中指定的 n 个程序管线对象。


boolean glIsProgramPipeline( uint pipeline );

检查一个给定的名称是否代表一个有效的程序管线对象。


void glBindProgramPipeline( uint pipeline );

将之前生成的名称与管线对象关联起来,从而创建一个新的状态向量。

  • 当 pipeline 设置为通过 glGenProgramPipelines 生成的新名称时,会创建一个新的、初始状态的管线对象。
  • 如果 pipeline 是已经存在的管线对象名称,则会绑定到该对象,并断开对任何先前所绑定管线对象的引用。
  • 如果 pipeline 设置为零,则解除当前的程序管线绑定,这意味着此时没有“当前”管线对象。

void glCreateProgramPipelines( sizei n, uint *pipelines );

这个函数的作用是:

  • 创建并初始化 n 个新的程序管线对象。
  • 将新创建的管线对象的名称存储在 pipelines 指向的数组中。
  • 新创建的每个管线对象都是一个状态向量,其包含的所有状态都将进行初始化。

这意味着,与 glGenProgramPipelines 和后续绑定操作相比,glCreateProgramPipelines 提供了一步到位的创建和初始化过程,无需额外的绑定步骤即可获得已准备就绪的程序管线对象。


void glUseProgramStages(uint pipeline, GLbitfield stages, GLuint program);

用于将程序对象关联的各个着色器阶段的可执行代码集成到程序管线状态中。

  • pipeline 是要更新的程序管线对象。
  • stages 是接受的常量的按位 OR,代表着各种着色器阶段。
  • program 是要从中获取可执行文件的程序对象标识符。

stages 参数中设置的位表示了要使得由 program 标识的程序对象成为当前状态的着色器阶段。这些阶段可以包括计算着色器、顶点着色器、曲面细分控制着色器、曲面细分评估着色器、几何着色器或片段着色器,分别用 COMPUTE_SHADER_BITVERTEX_SHADER_BITTESS_CONTROL_SHADER_BITTESS_EVALUATION_SHADER_BITGEOMETRY_SHADER_BITFRAGMENT_SHADER_BIT 来表示。常量 ALL_SHADER_BITS 表示要使得 program 成为所有着色器阶段的当前状态。

如果 program 是指向具有有效着色器的程序对象的引用,则此调用会将该阶段的可执行代码安装到指定的程序管线对象状态中。如果 glUseProgramStages 使用 program 设置为零,或者使用一个对于 stages 中的任何阶段都没有可执行代码的程序对象,那么就好像该管线对象未配置任何可编程阶段一样。

如果 pipeline 是由 glGenProgramPipelines 生成的名称(而没有后续删除),但是尚未绑定到先前生成的程序管线对象,则 OpenGL 会首先以与 glBindProgramPipeline 创建新程序管线对象相同的方式创建新的状态向量。


void glActiveShaderProgram( 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值