如何在程序状态下存储纹理制服?

时间:2013-03-04 13:27:39

标签: opengl glsl textures state uniform

我已经了解到统一值存储在着色器程序的状态中。

// GLSL code
uniform mat4 projection;

// C++ code
GLuint location = glGetUniformLocation(program, "projection");
glUniformMatrix4fv(location, 1, GL_FALSE, pointer);

但这似乎不适用于纹理制服,因为它们受纹理槽号码的限制,而不是它们的id。

// GLSL code
uniform sampler2D albedo;

// C++ code
int slot = 3;
glActiveTexture(GL_TEXTURE0 + slot);
glBindTexture(GL_TEXTURE_2D, id);
GLuint location = glGetUniformLocation(program, "albedo");
glUniform1i(location, slot);

有没有办法将纹理ID绑定到着色器的sampler2D制服?这样我就不必为每次传递手动绑定所有纹理。

1 个答案:

答案 0 :(得分:1)

  

有没有办法将纹理id绑定到着色器的sampler2D制服?

不,不是真的,因为采样器访问纹理单元,而不是纹理对象。然而,NVidia的Kepler GPU可以使用无边界纹理,OpenGL可作为特定于供应商的扩展,实际上可以实现您的要求。