OpenGLES 2 - 什么时候到glBindTexture,什么时候到glActiveTexture?

Shi*_*esh 17 textures opengl-es-2.0

好吧,所以这些纹理让我很困惑.我一直在看这个教程(我认为很棒),特别是"你可以定义最多32个纹理单元,但每个着色器最多可以定义8个纹理"的图片.据我了解,这是它的工作原理:

您激活纹理​​单位.然后,将纹理对象(类似于图像中的"纹理数据"立方体)绑定到该单元内的某个目标.所以,glGenTextures制作对象并得到它们的名字,然后glBindTexture将该纹理绑定到TEXTURE_2D或其他东西(我现在对其他目标不感兴趣).然后,您可以使用glTexImage2D指定纹理数据.

现在.我正在使用3个着色器程序,每个程序都需要不同的纹理.这就是我想要做的事情:

在初始化阶段,我浏览每个纹理单元,然后去

  • glActiveTexture
  • glBindTexture(在活动纹理单元上运行)
  • glTexImage2D(对当前绑定的对象进行操作)

对于着色器,我glUniform将每个着色器中的一个制服与glActiveTexture的GL_TEXTUREi中指定的'i'值相匹配.我总共只需要四个纹理,而且它们非常小.

现在,在渲染过程中,我应该能够很好地切换程序,一切正常,对吧?每个程序都有一个统一指定要使用的单元,每个单元已经有一个绑定到其TEXTURE_2D目标的对象,每个对象都有glTexImage2D指定的数据,对吗?所以我的渲染功能不需要绑定或激活单元?至少这是我理解它的方式,但是我在错误的地方绘制了错误的纹理.

此外,在我的一个程序中,我想在单个表面的三个纹理之间切换.所以我想我将每个纹理加载到一个对象中,并将每个对象绑定到一个单元,然后在渲染时我可以通过glUniform告诉程序使用哪个纹理单元.

所以我想知道我是否误解了OpenGL中纹理的基本结构,或者当程序切换时对象与单元的绑定是否会过期,或类似的东西.或者我是否需要多次绑定纹理 - 但何时,为什么?

uml*_*lum 11

不要忘记为每个纹理对象设置glTexParameteri.

void loadTextures() {
    GLint texture_object_handles[3];
    glGenTextures(3, texture_object_handles);

    for (int i = 0 ; i < 3 ; ++i) {
        glActiveTexture(GL_TEXTURE0 + i);
        glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, ...);
    }
    return;
}


void draw() {
    // Draw three different materials without rebinding any textures.
    for (i = 0 ; i < 3 : ++i) {
        ... specify other uniforms and attributes
        glUniform1i(texture_location, i);
        ... 
        glDrawElements(...);
    }
    return;
}    
Run Code Online (Sandbox Code Playgroud)