如何找出顶点着色器使用哪些制服以及片段着色器使用哪些制服

时间:2013-11-22 06:25:15

标签: opengl-es opengl-es-2.0 game-engine

我希望在编译着色器后获取const信息(在ogl中也称为uniform)。

在d3d9中,我可以通过使用D3DXGetShaderConstantTable接口获取ID3DXConstantTable,这样我就可以得到顶点着色器或片段着色器的const信息。

但是在ogl中,没有着色器的接口,只有名为glGetActiveUniform的程序的接口。使用此接口可以获取程序使用的所有制服,但不能知道顶点着色器使用的制服或片段着色器使用的制服。

那有什么办法吗?

1 个答案:

答案 0 :(得分:2)

我不确定这是不可能的,但我还没有看到这样做的方法。我推测,因为制服可以在链接阶段得到优化,所以你不能(或者更确切地说,没有做出包含和实现接口的努力)查询单个着色器并看看是什么意义变量是“活动”。

正如您所说,您可以获得整个计划的活动制服清单:
glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &n)
for (i = 0..n)
    glGetActiveUniform(program, i, ...)

但AFAIK没有办法找到哪个阶段引用它们,更重要的是,它们处于活动状态的阶段(对于前者,你可以做一些代码解析来猜测)。


唯一接近的是使用统一块,,它们在OpenGL ES2.0中不可用

glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCKS, &n)
for (i = 0..n)
    glGetActiveUniformBlockiv(program, i, ...)

您可以在哪里查询

  • GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER
  • GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER
  • GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER