加载纹理的功能无法正常工作

Function to load textures not working correctly

所以我写了一个辅助函数,它只加载一个 png 文件光盘并将其加载到 OpenGL 着色器中。

这一切都很好,直到我尝试加载多个纹理。我 运行 遇到的问题是它似乎每次都会覆盖所有以前的纹理。我不知道为什么会这样。如果我提供的代码还不够,完整的源代码已发布 here

这是 loadTexture 函数(驻留在 Helper.cpp)

GLuint loadTexture(const GLchar* filepath, GLuint& width, GLuint& height)
{
    // image vector.
    vector<GLubyte> img;

    // decodes the image to img
    decode(img, filepath, width, height);

    // if the image is empty return
    if (img.size() == 0)
    {
        std::cout << "Bad Image" << std::endl;
        system("pause");
        return 0;
    }
    // return value
    GLuint ret;

    // gen textures
    glGenTextures(1, &ret);

    // bind the ret to GL_TEXTURE_2D so everyting using GL_TEXTURE_2D referrs to ret
    glBindTexture(GL_TEXTURE_2D, ret);

    // set parameters. Current filtering techunique is GL_LINEAR http://www.arcsynthesis.org/gltut/Texturing/Tut15%20Magnification.html
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // copy the data to the texture associated with ret. 
    // format is RGBA internally and externally, and the size is unsigned char, which is unsigned byte
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &img[0]);

    return ret;

}

decode方法将图片保存到img中,将宽高分别存入width和height。

如果我遗漏了什么,请告诉我。

感谢您提供的任何帮助!

当某些东西不适用于 OpenGL 时,请始终先查看绘图代码。在你的绘图功能中(我讨厌 Dropbox,顺便说一句,首先必须下载那个狗屎以便我可以查看它)有这个:

        GLuint uniID = glGetUniformLocation(program, "tex");

        glActiveTexture(GL_TEXTURE0);
        glUniform1i(textures[idx], 0);

这就是你的问题所在。 textures[idx] 包含 textureID。但是纹理 ID 根本不会进入着色器制服。 glUniform 的第一个参数...是着色器变量的所谓 "location index"。查询名为 tex 的着色器变量的统一位置正上方。 那个 是统一调用的内容。该值是活动纹理单元的编号。

要select要使用的实际纹理,您必须绑定正确的纹理到正确的纹理单元。您的原始代码无法在需要时绑定所需的纹理。

使用此代码:

glUseProgram(program)
GLuint uniID = glGetUniformLocation(program, "tex");
for(…) {
    /* ... */
    int const unit = 0; // just for illustration
    glUniform1i(uniID, unit);
    glActiveTexture(GL_TEXTURE0 + unit);
    glBindTexture(GL_TEXTURE_2D, textures[idx]);
    /* draw stuff ...*/
}

顺便说一句:纹理未加载到着色器中。