stb_image出现奇怪的图像结果 [已关闭]

Strange image results with stb_image [closed]

提问人:Scollier 提问时间:11/17/2023 更新时间:11/17/2023 访问量:44

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

3天前关闭。

我正在尝试使用 OpenGL 和 C++ 渲染带有 stb_image 的图像。这是我用于生成纹理的代码:

class Texture {
    public:
        std::string filename;
        int width;
        int height;
        int channels;
        unsigned char* data; // Actual image data
        unsigned int ID;

        Texture(std::string textureFilename);
        Texture() = default;

        void bind();
};
#define STB_IMAGE_IMPLEMENTATION

#include "texture.hpp"

Texture::Texture(std::string textureFilename) {
    filename = textureFilename;

    glGenTextures(1, &ID);

    data = stbi_load(filename.c_str(), &width, &height, &channels, 0);
    if (data) {
        GLenum format;

        switch (channels) {
            case 1: 
                format = GL_RED;
                break;
            case 2:
                format = GL_RG;
                break;
            case 3:
                format = GL_RGB;
                break;
            case 4:
                format = GL_RGBA;
                break;
        }

        glBindTexture(GL_TEXTURE_2D, ID);
        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

        stbi_image_free(data);
    } else {
        std::cerr << "Could not find texture file: " << textureFilename << "\n";
        exit(1);
    }
}

void Texture::bind() {
    glBindTexture(GL_TEXTURE_2D, ID);
}

这段代码适用于某些纹理,但是当尝试渲染其他纹理(所有 png)时,它看起来像这样: 这是我尝试渲染的图像之一: enter image description here

enter image description here

知道这是怎么回事吗?为什么有些 png 有效,而另一些则无效?这只是一些奇怪的 png 编码还是什么?还是这是stb_image库本身的错误?

C++ 映像 opengl stb-image

评论

0赞 G.M. 11/17/2023
这回答了你的问题吗?当高度大于宽度时如何渲染YUV视频?
0赞 genpfault 11/17/2023
可重现性最小的示例中进行编辑。据我们所知,您已经默认为“坏”宽度,并尝试使用“坏”宽度。GL_UNPACK_ALIGNMENT4GL_RGB
0赞 Scollier 11/17/2023
谢谢@genpfault和@G.M.,添加有助于解决奇怪的失真问题,但颜色仍然是奇怪的绿色和红色,这不是我想要的结果。glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
0赞 Erdal Küçük 11/17/2023
如果您对某些 png 图像有疑问,请尝试 - 请参阅:github.com/nothings/stb/blob/master/stb_image.h#L312stbi_convert_iphone_png_to_rgb

答: 暂无答案