Невозможно отобразить текстуру на квад

Я пытаюсь запрограммировать простую игру на C ++, используя OpenGL для графики. В моей игре у меня есть объекты, которые отображаются на экране в виде белого квадрата. Я хотел бы иметь возможность привязать изображение в качестве текстуры к этим объектам, чтобы я мог отображать изображение на экране вместо белого квадрата. Нет ограничений на формат изображения, хотя я использую .png или .bmp для тестирования.

Один из моих классов объектов, Character.h, хранит переменную-член GLuint * с именем _texture и переменную-член без знака char * с именем _data (как дескриптор изображения и данные пикселей соответственно). В Character.h эта функция предназначена для привязки изображения в качестве текстуры к объекту Character:

void loadTexture(const char* fileName)
{
/* read pixel data */
FILE* file;
file = fopen(fileName, "rb");
if (file == NULL) {cout << "ERROR: Image file not found!" << endl;}
_data = (unsigned char*)malloc(_dimension * _dimension * 3);
fread(_data, _dimension * _dimension * 3, 1, file);
fclose(file);
/* bind texture */
glGenTextures(1, &_texture); // _texture is a member variable of type GLuint
glBindTexture(GL_TEXTURE_2D, _texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _dimension, _dimension, 0, GL_RGB, GL_UNSIGNED_BYTE, _data); // _dimension = 64.0f.
}

Как только изображение будет связано, я попытаюсь визуализировать объект Character с помощью этой функции (которая является статической функцией в отдельном классе):

static void drawTexturedRectangle(float x, float y, float w, float h, GLuint texture, unsigned char* data)
{
/* fractions are calculated to determine the position onscreen that the object is drawn at */
float xFraction = (x / GlobalConstants::SCREEN_WIDTH) * 2;
float yFraction = (y / GlobalConstants::SCREEN_HEIGHT) * 2;
float wFraction = (w / GlobalConstants::SCREEN_WIDTH) * 2;
float hFraction = (h / GlobalConstants::SCREEN_HEIGHT) * 2;
glEnable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glPushMatrix();
glEnable(GL_BLEND);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(xFraction, yFraction); // bottom left corner
glTexCoord2f(0.0f, 1.0f); glVertex2f(xFraction, yFraction + hFraction); // top left corner
glTexCoord2f(1.0f, 1.0f); glVertex2f(xFraction + wFraction, yFraction + hFraction); // top right corner
glTexCoord2f(1.0f, 0.0f); glVertex2f(xFraction + wFraction, yFraction); // bottom right corner
glEnd();
glDisable(GL_BLEND);
glPopMatrix();
}

Независимо от того, сколько я возиться с этим, я не могу заставить свою программу делать что-либо кроме рендеринга простого белого квадрата без текстуры на нем. Я проверил, чтобы все переменные file, _texture, _dimension и _data содержали значения. Кто-нибудь может определить, что я могу делать неправильно?

0

Решение

я не думаю, что вы можете просто ввести необработанный файл в glTexImage2D, за исключением случаев, когда вы храните файлы текстур в этом формате (что вы, вероятно, не делаете). glTexImage2D ожидает огромный массив байтов (представляющих цвета текселей), но форматы файлов обычно не хранят подобные изображения. Даже bmp содержит некоторую информацию заголовка.

Используйте стороннюю библиотеку загрузчиков изображений, такую ​​как DevIL или SOIL, чтобы загрузить свои текстуры! Эти библиотеки могут преобразовывать наиболее распространенные форматы файлов изображений (png, jpg, tga, …) в поток байтов, который вы можете вводить в OpenGL!

На примечании стороны:
После вызова glTexImage2D (…, data) содержимое данных копируется в память GPU (VRAM). С этого момента вам нужно всего лишь привязать текстуру, используя ее идентификатор, так как она уже есть в VRAM. Вызов glTexImage2D () в каждом кадре перезагрузит всю текстуру каждого кадра в vram, что приведет к значительному снижению производительности.

0

Другие решения


По вопросам рекламы [email protected]