如何正确加载图像以用作OpenGL纹理?

时间:2018-01-20 23:37:04

标签: c++ opengl

我正在尝试使用SOIL2将图像加载到OpenGL纹理中;但是,除非我使用SOIL2加载纹理功能,否则它似乎永远不会是正确的。我尝试过使用STB图像和Devil,但两者都得到了类似的结果。

代码:

GLuint load_image(const std::string& path) {
    int iwidth, iheight, channels;
    unsigned char* image = SOIL_load_image(path.c_str(), &iwidth, &iheight, &channels, SOIL_LOAD_RGBA);
    //  std::cout << SOIL_last_result() << std::endl;
    //  float* image = stbi_loadf(path.c_str(), &iwidth, &iheight, &channels, STBI_rgb_alpha);
    //  if(!ilLoadImage(path.c_str()))
    //      std::cout << "Devil Failed to load image: " << iluErrorString(ilGetError()) << std::endl;
    //
    //  unsigned char* image = ilGetData();
    //
    //  int iwidth = ilGetInteger(IL_IMAGE_WIDTH);
    //  int iheight = ilGetInteger(IL_IMAGE_HEIGHT);
    //  int channels = ilGetInteger(IL_IMAGE_CHANNELS);

    GLuint texture;
    glGenTextures(1, &texture);

    glActiveTexture(GL_TEXTURE0 + texture);
    GLint old_unpack_alignment;
    glGetIntegerv(GL_UNPACK_ALIGNMENT, &old_unpack_alignment);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glBindTexture(GL_TEXTURE_2D, texture);
    glCheckError();

    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);
    glCheckError();

    GLenum original_format = (channels == 4 ? GL_RGBA : GL_RGB);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);

    glPixelStorei(GL_UNPACK_ALIGNMENT, old_unpack_alignment);
    return texture;
}

截图:

Example Output

我应该得到什么:

Correct Output

我想知道如何将图像正确加载到纹理中。

1 个答案:

答案 0 :(得分:2)

以下是我的纹理加载函数的示例:

int(5)

我通常会设置我的VAO&amp; VBO之前,然后我将使用它来加载纹理。在此之后,我将配置我的着色器以供使用,然后在渲染循环中我将使用我的着色器,设置矩阵传递任何所需的制服,然后在所有&#34之后;模型&#34;信息完成我终于绑定了VertexArrays,将approrpriate纹理设置为Active,然后绑定那些纹理,并绘制数组或基元。