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

时间:2012-10-25 09:24:58

标签: opengl-es-2.0 textures

好吧,所以这些纹理让我很困惑。我一直在看this教程(我觉得很棒),尤其是“你最多可以定义32个纹理单位,但每个着色器最多可以定义8个纹理”的图片。据我了解,这是它的工作原理:

激活纹理单元。然后,将纹理对象(类似于图像中的“纹理数据”立方体)绑定到该单元内的某个目标。所以,glGenTextures制作的对象&获取他们的名字,然后glBindTexture将该纹理绑定到TEXTURE_2D或其他东西(我现在对其他目标不感兴趣)。然后你可以用glTexImage2D指定纹理数据。

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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;
}