我希望在编译着色器后获取const信息(在ogl中也称为uniform)。
在d3d9中,我可以通过使用D3DXGetShaderConstantTable接口获取ID3DXConstantTable,这样我就可以得到顶点着色器或片段着色器的const信息。
但是在ogl中,没有着色器的接口,只有名为glGetActiveUniform的程序的接口。使用此接口可以获取程序使用的所有制服,但不能知道顶点着色器使用的制服或片段着色器使用的制服。
那有什么办法吗?
答案 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
,