0

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

// 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着色器的制服?这样我就不必为每个通道手动绑定所有纹理。

4

1 回答 1

1

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

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

于 2013-03-04T13:28:58.230 回答