2012-02-22 2 views
0

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

Кодовые файлы:

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

  • текстуры класса: обертку для 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().

+0

Почему вы используете Cygwin? И запускаете ли вы программу в среде Cygwin? – AndiDog

+0

«Я подозреваю, что функция Texture :: loadData() не работает» ... так вы пытались сделать то же самое на одних и тех же данных в минимальном примере за пределами класса Texture? Это работает? – Bart

+0

@AndiDog Это способ настройки Eclipse ... У меня нет установленного mingw, и я не уверен, что libpng существует в Windows. – Tibi

ответ

1

Вам необходимо проверить коды ошибок 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 в return (дескриптор и все), а затем вызывается ~ Texture(), уничтожая копию на основе стека. Таким образом, ваша программа вызовет glDeleteTextures пару раз!

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

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

Используйте TexturePtr как возвращаемый тип. Инициализировать его в generateTexture(), как это:

TexturePtr t(new Texture); 

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

+0

Забыл упомянуть, что функция Error выводит в файл журнала, если есть какая-либо ошибка, вот и все, и ошибка не появляется. Я также попытался сгенерировать изображение в памяти (используя memset), но это тоже не сработало. Теперь я пытаюсь glGetError. – Tibi

+0

Нет, ничего ... У меня нет никакой ошибки gl. – Tibi

+0

Спасибо, это была проблема ... был вызван деструктор, что вызывало проблемы. – Tibi