我的Render类中有一个名为showMainMenu()的方法。 在渲染中,我将纹理定义为位图
Bitmap* bBall;
Bitmap* bWall;
Bitmap* bStart;
Bitmap* bEnd;
Bitmap* bHighscores;
Bitmap* bHelp;
Bitmap* bStar;
在我的渲染中,我做了:
this->bBall = new Bitmap("ball.bmp");
this->bEnd = new Bitmap("beenden.bmp");
this->bStart = new Bitmap("starten.bmp");
this->bStar = new Bitmap("star.bmp");
this->bHelp = new Bitmap("hilfe.bmp");
this->bHighscores = new Bitmap("highscores.bmp");
this->bWall = new Bitmap("wall.bmp");
在showMainMenu()中,我按以下方式绑定纹理:
glEnable(GL_TEXTURE_2D); //Texturen aktivieren
//draw Start button
glBindTexture( GL_TEXTURE_2D, this->bStar->texture);
但我的显示器保持白色:( 当我在我的方法
中加载纹理时Bitmap m = Bitmap("star.bmp");
glBindTexture( GL_TEXTURE_2D, m.texture);
我可以看到纹理。 为什么不是第一个工作?
答案 0 :(得分:2)
我最好的猜测是,您在创建OpenGL上下文之前创建了Bitmap
个实例。然后将加载位图文件,但不生成纹理对象。解决这个问题的最简单方法:在实现Bitmap(即在构造函数中)时,只需加载文件数据并将纹理ID变量设置为0.添加方法bindTexture
,为您调用glBindTexture(无论如何都应该这样做) ,这就是OOP应该如何工作的方式)。但是如果纹理ID为零,还要添加一个测试,然后在绑定之前生成ID和纹理。
示例:
void Bitmap::bindTexture()
{
if(!textureID) {
glGenTextured(1, &textureID);
glBindTexture(GL_TEXTURE_..., textureID);
upload_texture_data();
} else {
glBindTexture(GL_TEXTURE_..., textureID);
}
}
顺便说一句:通过this->
访问班级成员被视为不良风格,并且绝对没有理由这样做。甚至将this
指针强制转换为基类也不会为您提供虚拟方法,因为隐式向上转换是虚拟的全部内容。