将多个纹理 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);

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

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

最新更新