我已经了解到统一值存储在着色器程序的状态中。
// 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
制服?这样我就不必为每次传递手动绑定所有纹理。
答案 0 :(得分:1)
有没有办法将纹理id绑定到着色器的sampler2D制服?
不,不是真的,因为采样器访问纹理单元,而不是纹理对象。然而,NVidia的Kepler GPU可以使用无边界纹理,OpenGL可作为特定于供应商的扩展,实际上可以实现您的要求。