将多个纹理OpenGL绑定到不同的四边形

时间:2019-04-21 09:49:45

标签: c++ opengl

我设法使我的游戏读取到PNG文件中,并成功构造了我的对象。老实说,我无法100%确定其实际工作方式-现在我想将其扩展为加载多个纹理,并使用我指定的纹理。

这是我的PNG加载功能:

//Loads PNG to texture
GLuint loadPNG(string name) {
    nv::Image img;
    GLuint myTextureID;

    if (img.loadImageFromFile(name.c_str())) {
        glGenTextures(1, &myTextureID);
        glBindTexture(GL_TEXTURE_2D, myTextureID);
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
        glTexImage2D(GL_TEXTURE_2D, 0, img.getInternalFormat(), img.getWidth(), img.getHeight(), 0, img.getFormat(), img.getType(), img.getLevel(0));
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_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);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
    }
    else {
        MessageBox(NULL, L"Failed to load texture", L"Sorry!", MB_OK | MB_ICONINFORMATION);
    }
    return myTextureID;
}

在我的主要功能中,我这样定义纹理:

//Load in player texture
testTexture = loadPNG("test.png");

其中testTexture是全局变量,类型为GLuint。并在主draw循环中绘制矩形是这样的:

//Used to draw rectangles
void drawRect(gameObject &p) {
    glEnable(GL_TEXTURE_2D);

    //Sets PNG transparent background
    glEnable(GL_BLEND);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //glBindTexture(GL_TEXTURE_2D, myTexture);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(p.x, p.y);
    glTexCoord2f(1.0, 0.0); glVertex2f(p.x + p.width, p.y);
    glTexCoord2f(1.0, 1.0); glVertex2f(p.x + p.width, p.y + p.height);
    glTexCoord2f(0.0, 1.0); glVertex2f(p.x, p.y + p.height);
    glEnd();

    glDisable(GL_TEXTURE_2D);
}

这很好,可以使用定义的纹理对我的所有对象进行纹理处理。但是,我希望能够定义更多的纹理并使用它们。我尝试移动:

glBindTexture(GL_TEXTURE_2D, myTextureID);

loadPNG函数进入我的drawRect,如下:

glBindTexture(GL_TEXTURE_2D, testTexture);

但是,这不会应用任何纹理。如果有人有任何想法,我将非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

您必须绑定纹理才能使用glTexImage2D对其进行初始化。不要从glBindTexture删除对loadPNG的呼叫。如果要使用其他纹理进行渲染,只需在渲染四边形之前先绑定纹理即可。