SDL2 (C++) 并非所有 .png 图像都能正确呈现

Posted

技术标签:

【中文标题】SDL2 (C++) 并非所有 .png 图像都能正确呈现【英文标题】:SDL2 (C++) not all .png images render correctly 【发布时间】:2017-01-08 18:08:36 【问题描述】:

注意:我使用的是旧版 OpenGL

所以我遇到了一个问题,只有少数 .png 图像可以正确渲染。

这是渲染游戏的示例截图(左:enemyRed.png,右:(ship.png)):

这是我用来加载图片的代码:

SpriteImage* SDLOpenGL::loadImage(std::string path) 
    SDL_Surface * surface = IMG_Load(path.c_str());
    SpriteImage * image = new SpriteImage(&*surface);

    return image;

这是 SpriteImage 类:

SpriteImage::SpriteImage(SDL_Surface *surface) 
    this->surface = surface;
    this->TextureID = 0;


void SpriteImage::bind() 
    glTexImage2D(GL_TEXTURE_2D,
            0,
            this->mode,
            this->surface->w,
            this->surface->h,
            0,
            this->mode,
            GL_UNSIGNED_BYTE,
            this->surface->pixels
            );
    glBindTexture(GL_TEXTURE_2D, this->TextureID);


int SpriteImage::getWidth() 
    return this->surface->w; 


int SpriteImage::getHeight() 
    return this->surface->h;

这是我渲染图像的地方:

(注意,this->getCurrentImage() 返回一个“SpriteImage”)

void Sprite::draw(float delta) 
    this->getCurrentImage()->bind();

    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0.0f, 0.0f);

    glTexCoord2f(0, 1);
    glVertex2f(0.0f, this->getHeight());

    glTexCoord2f(1, 1);
    glVertex2f(this->getWidth(), this->getHeight());

    glTexCoord2f(1, 0);
    glVertex2f(this->getWidth(), 0.0f);
    glEnd();

    this->next();

【问题讨论】:

这里是图片顺便说一句:imgur.com/a/a5zNW 【参考方案1】:

未渲染的图像的宽度不能被 4 整除。您应该在glTexImage2D 之前使用glPixelStoreiGL_UNPACK_ALIGNMENT 来指定内存中行的对齐方式——这可能是未对齐的(OpenGL 假定默认情况下它们四字节对齐的)。

你应该先glBindTexture然后然后glTexImage2D上传数据。

你有没有打电话给glGenTextures?你应该用glGenTextures初始化TextureID

不应在每次绑定纹理时都上传纹理。而是在构造函数中上传它,然后切换纹理你只需要glBindTexture你的TextureID

【讨论】:

以上是关于SDL2 (C++) 并非所有 .png 图像都能正确呈现的主要内容,如果未能解决你的问题,请参考以下文章

SDL2:将图像另存为 png 错误

SDL2 错误:使用 pyinstaller 冻结 kivy 应用程序时“无法加载图像 <default.png>”

用 SDL2 加载PNG平铺背景并显示前景

发送超过 10000 条推送通知,但并非所有设备都能收到

SDL2/表面/纹理/渲染

如何在 C++ 或 C 中创建和编写索引 png 图像