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

Opengl 如何在程序状态下存储纹理制服?,opengl,glsl,textures,state,uniform,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 sampl

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

// 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
统一体?这样,我就不必为每个过程手动绑定所有纹理

有没有办法将纹理id绑定到着色器的二维均匀性


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

谢谢您的回答。我至少可以使用
layout(location=3)
来简化这个过程吗?好吧,如果你想要的是,你可以编写
glUniform1i(3,纹理单位使用)然后是。好的,我意识到这是另一回事。@sharethis:“我至少可以使用布局(位置=3)简化流程吗?”如果您有GL 4.2实现或支持的硬件,是的。只有
绑定
,而不是
位置