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
之前使用glPixelStorei
和GL_UNPACK_ALIGNMENT
来指定内存中行的对齐方式——这可能是未对齐的(OpenGL 假定默认情况下它们是四字节对齐的)。
你应该先glBindTexture
然后然后用glTexImage2D
上传数据。
你有没有打电话给glGenTextures
?你应该用glGenTextures
初始化TextureID
。
不应在每次绑定纹理时都上传纹理。而是在构造函数中上传它,然后切换纹理你只需要glBindTexture
你的TextureID
。
【讨论】:
以上是关于SDL2 (C++) 并非所有 .png 图像都能正确呈现的主要内容,如果未能解决你的问题,请参考以下文章