OpenGL 2d текстура не работает - PullRequest
       21

OpenGL 2d текстура не работает

0 голосов
/ 22 февраля 2012

Я работаю над проектом 2D-игры, и я хотел обернуть текстуру openGl в простой класс. Текстура считывается из 128x128px .png (с альфа-каналом), используя libpng . Поскольку объем кода довольно велик, я использую pastebin.

Файлы кодов:

Чтобы не тратить ваше время, я немного объясню код:

  • Класс текстуры : оболочка для текстуры OpenGL. Функция loadData устанавливает текстуру в gl (эта функция, я подозреваю, не работает).

  • Код OpenGl : функция debugSetTexture помещает текстуру в переменную temp, которая используется в функции graphicsDraw(). Это потому, что он не находится в том же исходном файле, что и main(). В функции graphicsMainLoop() я использую функцию Fork(), которая фактически вызывает fork() и сохраняет pid порожденного процесса.

С main() вот что я делаю:

Strategy::IO::PngReader reader ("/cygdrive/c/Users/Tibi/Desktop/128x128.png");
reader.read();
grahpicsInit2D(&argc, argv);
debugSetTexture(reader.generateTexture());
graphicsMainLoop();
reader.close();

Я попробовал приложение под названием gDEBugger, и в средстве просмотра текстуры была сгенерирована текстура, но размер был 0x0px.

Я подозреваю, что проблема возникает, когда текстура загружается с использованием Texture :: loadTexture ().

1 Ответ

1 голос
/ 23 февраля 2012

Вам необходимо проверить коды ошибок GL после вызовов GL.

Например, добавьте этот метод в ваш класс:

GLuint Texture::checkError(const char *context)
{
  GLuint err = glGetError();
  if (err > 0 )  { 
    std::cout << "0x" << std::hex << err << " glGetError() in " << context 
    << std::endl;
  }
  return err;
}

тогда назовите это так:

glBindTexture(GL_TEXTURE_2D, handle);
checkError("glBindTexture");

Предполагается, что загрузка файла png удалась, предположим, что ваша программа перестала работать в glBindTexture? (сильный намек)

Вы вызвали функцию Error для обработки файла, но ваша программа останавливается или запускается?

Вот серьезная проблема: Texture PngReader :: generateTexture () возвращает Texture по значению. Это приведет к тому, что ваш объект Texture будет скопирован при возврате (handle и all), а затем будет вызван ~ Texture (), уничтожив копию на основе стека. Так что ваша программа будет вызывать glDeleteTextures пару раз!

Если вы хотите вернуть его по значению, вы можете заключить его в shared_ptr <>, который выполняет подсчет ссылок. Это приведет к тому, что деструктор будет вызван только один раз:

#include <tr1/memory>
typedef std::tr1::shared_ptr<Texture> TexturePtr;

Используйте TexturePtr в качестве типа возврата. Инициализируйте его в generateTexture () следующим образом:

TexturePtr t(new Texture);

затем измените все методы доступа, чтобы пройти -> вместо.

...