Как я могу добавить несколько текстур без Glaux? - PullRequest
2 голосов
/ 11 августа 2011

есть проблема, которую я не знаю, как решить. Я знаю, как получить несколько текстур в моей 3D-игре openGL и MVC ++ 2010, но путь очень медленный. Чем больше текстур я загружаю, тем медленнее игра. Прошло 2 недели с тех пор, как я застрял с этим. Я искал много сайтов, но ни один из них не помог мне.

Я не хочу glaux, потому что он продолжает давать мне ошибки и, как говорят, имеет утечки памяти. Вот как я загружаю .RAW текстуры:

GLuint texture; //ID to bind with

    GLuint LoadTexture(const char *filename, int imW, int imH){
    unsigned char*data;
    FILE*file;

    file=fopen(filename,"rb");
    if(file==NULL)return 0;
    data=(unsigned char*)malloc(imW*imH*3);
    fread(data,imW*imH*3,1,file);
    fclose(file);

    glGenTextures(1,&texture);
    glBindTexture(GL_TEXTURE_2D,texture);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D,0x8191,1); //0x8191 means GL_GENERATE_MIPMAP
    glTexImage2D(GL_TEXTURE_2D,0,3,imW,imH,0,GL_RGB,GL_UNSIGNED_BYTE,data);
    free(data);
    return texture;
    }

У меня есть opengl 2, но я использую "glTexParameterf (GL_TEXTURE_2D, 0x8191,1);" строить мипмапы, потому что "gluBuild2DMipmaps" медленнее этого.

void model_room(float x, float y, float x2, float y2, float z, float z2){
LoadTexture("tex_floor.raw",512,512);
model_floor(x,y,x2,y2,z,7,7);
glDeleteTextures(1,&texture);

LoadTexture("tex_ceiling.raw",512,512);
model_floor(x,y,x2,y2,z2,4,4);
glDeleteTextures(1,&texture);

LoadTexture("tex_wall.raw",512,512);
model_wall(x,y,x,y2,z,z2,1,1);
glDeleteTextures(1,&texture);

LoadTexture("tex_tiles.raw",512,512);
model_wall(x,y2,x2,y2,z,z2,1,1);
glDeleteTextures(1,&texture);

LoadTexture("tex_diamondtiles.raw",512,512);
model_wall(x2,y2,x2,y,z,z2,1,1);
glDeleteTextures(1,&texture);

LoadTexture("tex_castlepoint.raw",512,512);
model_wall(x2,y,x,y,z,z2,5,3);
glDeleteTextures(1,&texture);
}

Здесь код загружает текстуры, а затем удаляет их каждый кадр. Возможно, это не очень хорошая идея, но пока все в порядке. Для "model_wall" и "model_floor" это код:

    void model_floor(float x, float y, float x2, float y2, float z, float tc1, float tc2){
glBegin(GL_QUADS);
    glTexCoord2f(0,     0);     glVertex3f(x,  y,  z);
    glTexCoord2f(tc1,   0);     glVertex3f(x,  y2, z);
    glTexCoord2f(tc1,   tc2);   glVertex3f(x2, y2, z);
    glTexCoord2f(0,     tc2);   glVertex3f(x2, y,  z);
glEnd();
    }

    void model_wall(float x, float y, float x2, float y2, float z1, float z2, float tch, float tcv){
glBegin(GL_QUADS);
    glTexCoord2f(0,     0);     glVertex3f(x,   y,  z2);
    glTexCoord2f(tch,   0);     glVertex3f(x2,  y2, z2);
    glTexCoord2f(tch,   tcv);   glVertex3f(x2,  y2, z1);
    glTexCoord2f(0,     tcv);   glVertex3f(x,   y,  z1);
glEnd();
    }

Мне просто нужен хороший способ загрузки текстур без замедления игры, и не важно загружать только сырые файлы, но все, что рекомендуется. Я не программист Win Base, поэтому мне может понадобиться какое-то объяснение этих кодов. Любая помощь будет оценена. Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Возможно, не стоит загружать и уничтожать все текстуры в каждом кадре? Определенно не очень хорошая идея и, безусловно, причина вашего падения производительности!Вот для чего нужны объекты текстуры (идентификаторы, которые вы получаете от glGenTextures).Это дескрипторы текстур в видеопамяти.Таким образом, вы загружаете все свои текстуры в начале, а затем просто связываете необходимую текстуру (используя glBindTexture) перед рисованием (перед вызовами model_wall).А потом, в конце своей программы, вы уничтожаете их, используя glDeleteTextures.

. При упоминании glaux я предполагаю, что вы используете довольно старые учебные материалы, возможно, вам стоит поискать лучший учебник / книгу, еслиполучил эту практику оттуда.

2 голосов
/ 11 августа 2011

Загрузка текстур в каждом кадре - ужасная идея, и, возможно, поэтому ваша игра тормозит. Просто загрузите их один раз, а затем сделайте их активными при использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...