Вам необходимо проверить коды ошибок 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);
затем измените все методы доступа, чтобы пройти -> вместо.