我可以在绘制调用之间修改OpenGL纹理参数吗?

时间:2015-11-12 17:09:24

标签: ios opengl-es textures

在iOS中使用OpenGL ES 2,我有一个纹理,可以在多个层中使用。我现在想要在其中一个图层中稍微改变它,而不复制纹理本身。

我最初使用my_texture_data中的数据创建纹理。这很好。

GLuint lTexId;
glGenTextures(1, &lTexId);
glBindTexture(GL_TEXTURE_2D, lTexId);

// use linear filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, my_texture_data);

glBindTexture(GL_TEXTURE_2D, 0);

我想在其中一个图层中使用最近邻居样本。是否可以(如果是这样,如何)简单地在绘制调用之间切换过滤模式?我尝试添加这个,就在绘制每个对象的绘制调用之前

        /* Excerpt from common code block used to render texture in all layers */
        /* NEW CODE BLOCK */
        if (use_nearest) {
            glActiveTexture(GL_TEXTURE2);
            GLuint tex_id = getTextureId(); // a function to get original texture ID
            glBindTexture(GL_TEXTURE_2D, tex_id);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            GLuint lastError = glGetError();
            if (lastError != 0) {
                printf("GLERROR: %i", lastError);
            }
            glBindTexture(GL_TEXTURE_2D, 0);
        }
        else {
            glActiveTexture(GL_TEXTURE2);
            GLuint tex_id = getTextureId(); // a function to get original texture ID
            glBindTexture(GL_TEXTURE_2D, tex_id);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            GLuint lastError = glGetError();
            if (lastError != 0) {
                printf("GLERROR: %i", lastError);
            }
            glBindTexture(GL_TEXTURE_2D, 0);
        }
        /* END NEW CODE */


        glDrawElements(GL_TRIANGLE_STRIP, _IndexCount, GL_UNSIGNED_SHORT, 0);

尝试的解决方案无效。没有GL错误,但过滤模式在创建纹理时保持原始设置。

我在OpenGL: Reusing the same texture with different parameters中看到了一个潜在的答案,但是现在我需要一个不需要代码重构的快速解决方案。

该答案中的评论表明“你可以在需要的时候更改纹理参数” - 我似乎没有正确地做到这一点。

有关如何更改参数/我做错了什么的任何建议?

0 个答案:

没有答案