OpenGL отображает только текстуры, загруженные в методе? - PullRequest
0 голосов
/ 27 января 2012

В моем классе Render есть метод showMainMenu (). В Render я определил свои текстуры как растровые изображения

Bitmap* bBall;
Bitmap* bWall;
Bitmap* bStart;
Bitmap* bEnd;
Bitmap* bHighscores;
Bitmap* bHelp;
Bitmap* bStar;

В моем ctor Render я делаю:

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-й?

1 Ответ

2 голосов
/ 27 января 2012

Мое лучшее предположение заключается в том, что вы создаете Bitmap экземпляры до создания контекста OpenGL. Затем будет загружен растровый файл, но объект текстуры не будет создан. Самый простой способ исправить это: при создании Bitmap (т.е. в конструкторе) просто загрузите данные файла и установите переменную ID текстуры в 0. Добавьте метод bindTexture, который вызывает glBindTexture для вас (вы должны сделать это в любом случае, как ООП должен работать). Но также добавьте тест, если идентификатор текстуры равен нулю, и сгенерируйте идентификатор и текстуру перед привязкой.

Пример:

void Bitmap::bindTexture()
{
   if(!textureID) {
      glGenTextured(1, &textureID);
      glBindTexture(GL_TEXTURE_..., textureID);
      upload_texture_data();
   } else {
      glBindTexture(GL_TEXTURE_..., textureID);
   }
}

Кстати: доступ к ученикам через this-> считается плохим стилем, и нет абсолютно никаких причин делать это таким образом. Черт возьми, даже приведение указателя this к базовому классу не даст вам его виртуальных методов, потому что неявное перенаправление - это весь смысл виртуалов.

...