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

时间:2015-01-31 09:12:11

标签: c++ opengl textures

所以我编写了一个辅助函数,它只加载一个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;

}

解码方法将图像保存为img,并分别将宽度和高度存储到宽度和高度。

如果有遗漏的东西请告诉我。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

当某些内容无法与OpenGL一起使用时,请先查看绘图代码。在你的绘图功能(我讨厌Dropbox,BTW,首先必须下载那个狗屎,以便我可以查看它)有这个:

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

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

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

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

使用此代码:

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 ...*/
}

BTW:纹理未加载到着色器中。