OpenGL 4.1 程序流水线制服

Posted

技术标签:

【中文标题】OpenGL 4.1 程序流水线制服【英文标题】:OpenGL 4.1 Program Pipeline Uniforms 【发布时间】:2014-11-28 16:05:49 【问题描述】:

在 OpenGL 4.1 中,separate_shader_objects 扩展使其成为核心。

我知道我可以使用glGen,BindProgramPipeline() 创建/使用程序管道对象。但是如何为这个管道设置 Uniforms?

我读过glProgramUniform(),但不是很了解。

我认为glProgramUniform 需要一个(可分离的)程序对象。 当我现在使用以前创建的程序对象作为程序管道的阶段,然后在此程序对象上调用 glProgramUniform 时,这会影响整个管道吗?还是我必须再次为每个程序对象调用glProgramUniform

【问题讨论】:

【参考方案1】:

您是在暗示您的流水线中的各个阶段都有同名的制服吗?例如,与顶点阶段关联的程序有一个uniform float time,与片段阶段关联的程序有一个uniform float time?

考虑到可分离着色器的全部意义不是将阶段链接在一起,因此没有共享制服的概念。每个阶段都有自己的离散命名空间。

您提到的扩展在首次提出时已解决:

3.  Do different program objects currently used by different shader
    types share a single name space for uniforms?

    RESOLVED:  No, different program objects have their own separate
    name space for uniforms and each has locations specific to its
    unique program object.

这意味着您必须为管道中的每个程序对象设置统一,即使阶段共享通用名称。

【讨论】:

以上是关于OpenGL 4.1 程序流水线制服的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL官方教程——着色器语言概述

opengl中纹理单元和采样器制服之间的对应关系

OpenGL渲染管线漫谈

用Verilog搭建RISC-V架构流水线CPU

MSP430-GRACE 实战:LED流水灯

通过多个类传递 OpenGL 3.0 制服的问题