注意:我使用的是Legacy 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();
}
答案 0 :(得分:0)
不渲染的图像的宽度不可分割为四。您应该在glPixelStorei
之前使用GL_UNPACK_ALIGNMENT
和glTexImage2D
来指定内存中行的对齐方式 - 这可能是未对齐的(默认情况下,OpenGL假定它们 4 -byte aligned)。
您应先glBindTexture
,然后使用glTexImage2D
上传数据。
你有没有打电话给glGenTextures
?您应该使用TextureID
初始化glGenTextures
。
每次绑定纹理时都不应上传纹理。而是将其上传到构造函数中,然后切换纹理,只需要glBindTexture
TextureID
{/ 1>}。