OpenGL只显示在方法中加载的纹理?

时间:2012-01-27 12:49:36

标签: c++ windows opengl glut

我的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);

我可以看到纹理。 为什么不是第一个工作?

1 个答案:

答案 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指针强制转换为基类也不会为您提供虚拟方法,因为隐式向上转换是虚拟的全部内容。