2013-11-22 154 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

相關問題