2013-11-22 126 views
0

我想在编译着色器之后获取const信息(在ogl中也称为uniform)。如何找出顶点着色器使用哪些制服以及片段着色器使用哪些制服

在d3d9中,我可以通过使用D3DXGetShaderConstantTable接口获得ID3DXConstantTable,所以我可以获得顶点着色器或片段着色器的常量信息。

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

有没有什么办法?

+0

为什么downvote?这似乎是一个自然的本能,就是懒懒地问“你为什么要这样做?”而不是解决一个有趣的问题,而不管应用程序如何。 – jozxyqk

回答

2

我不确定这是不可能的,但我还没有看到一种方法来做到这一点。我会推测,因为校服可以在连接阶段得到优化,所以不能(或者说,包含和实现一个接口的努力还没有完成)查询单个着色器并查看变量是“活动”。

就像你说的,你可以得到积极的制服的列表整个程序:
glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &n)
for (i = 0..n)
    glGetActiveUniform(program, i, ...)

但据我所知是没有办法找到哪个阶段引用他们,多这一点,他们是积极的阶段(前者,你可以做一些代码解析猜测)。


来接近的唯一事情是均匀的块,其不可在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
+0

很好的答案。但请注意,统一块仅在OpenGL ES 3.0(不是2.0)和OpenGL(桌面)3.3或更高版本中可用。 – rickster

+0

@rickster哦,当然。谢谢 :) – jozxyqk

相关问题