2013-03-03 7 views
0

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

Вот код:

Класс game.cpp:

object = new Object("table.obj", "wood.bmp",0); // a new object - obj file, texture and 
object1 = new Object("aa.obj", "cloth.bmp",1); // texture number 

object->draw(); 
object1->draw(); 

Класс объекта:

AUX_RGBImageRec *texture; 

Object::Object(char* filename, char* texname, int num) { 
tex_num = num; 
is_loaded = false; 
.... some vertex stuff here 
texture = auxDIBImageLoadA(texname); 
} 

void Object::draw() { 
if(!is_loaded) { 
    loadTexture(); 
    is_loaded = true; 
} 
... vertex stuff again 
void Object::loadTexture() { 
    GLuint *tex = new GLuint[10]; 
unsigned int names[10]; 
glGenTextures(1, tex); 
glBindTexture(GL_TEXTURE_2D, tex[tex_num]); 
cout << tex_num << endl; 
// glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, 
     texture->sizeX, 
     texture->sizeY, 
     0, GL_RGB, GL_UNSIGNED_BYTE, 
     texture->data); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
// free memory 
delete tex; 
cout << tex_num << endl; 
    } 
+0

Пожалуйста, прекратите использование AUX для загрузки изображений. Если вы используете учебник, в котором используется AUX, прекратите использовать этот учебник и [найдите лучшие.] (Http://www.opengl.org/wiki/Getting_Started#Tutorials_and_How_To_Guides) –

ответ

1

Почему вы динамически выделяете переменную ID текстуры? Почему вы удаляете его в конце loadTexture, когда вам это нужно, чтобы на самом деле ссылаться на текстуру при рисовании? OpenGL не будет магически связывать текстуры с самой геометрией.

следующие изменения:

- Object::Object(char* filename, char* texname, int num) { 
+ Object::Object(char* filename, char* texfilename) { 

-  tex_num = num; 
    is_loaded = false; 
    .... some vertex stuff here 
- texture = auxDIBImageLoadA(texname); 
+ loadTexture(texfilename); 

} 

class Object { 
/*...*/ 
+  GLuint texID; 
} 

void Object::draw() { 
-if(!is_loaded) { 
-  loadTexture(); 
-  is_loaded = true; 
- } 

+ glBindTexure(GL_TEXTURE_2D, texID); 
+ draw_geometry(); 
} 

- void Object::loadTexture() { 
+ void Object::loadTexture(char const * const texfilename) { 

- GLuint *tex = new GLuint[10]; 
- unsigned int names[10]; 
- glGenTextures(1, tex); 
- glBindTexture(GL_TEXTURE_2D, tex[tex_num]); 
- cout << tex_num << endl; 

+ glGenTexture(1, &texID); 
+ glBindTexture(GL_TEXTURE_2D, texID); 
+ cout << texID << endl; 

+ // Image is a yet to implement class offering image loading 
+ // in a RAII fashion. 
+ Image img = Image::fromFile(texfilename); 

- // glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
- glTexImage2D(GL_TEXTURE_2D, 0, 3, 
-   texture->sizeX, 
-   texture->sizeY, 
-   0, GL_RGB, GL_UNSIGNED_BYTE, 
-   texture->data); 

+ glPixelStorei(GL_UNPACK_ALIGNMENT, img.alignment()); 
+ glTexImage2D(GL_TEXTURE_2D, 0, 
+   img.glinternalformat(), // don't use a channel count here! 
+   img.width(), 
+   img.height(), 
+   0, 
+   img.glformat(), 
+   img.gltype(), 
+   img.data()); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

-  // free memory 
-  delete tex; 
-  cout << tex_num << endl; 
+  cout << texID << endl; 

    } 
+0

Большое спасибо за ваш ответ. Но мне все равно нужно вызывать if (! Is_loaded) {.. блокировать один раз в режиме рисования, без этого текстуры не отображаются. – DarkSun

+0

@DarkSun: Тогда вы, вероятно, создаете свои экземпляры «Объект», прежде чем будет создан и активирован контекст OpenGL. В этом случае по требованию загрузка ресурсов в функции отображения является возможным решением. – datenwolf

0

Теперь, когда ваша первая ничья() вызов загружается текстуру, вы просто необходимо вызвать glBindTexture (GL_TEXTURE_2D, your_generated_buffer) перед каждой ничьей.

void  Object::draw() 
{ 
     if(!is_loaded) 
     { 
      loadTexture(); 
      is_loaded = true; 
     } 
     glBindTexture(GL_TEXTURE_2D, this->texture_buffer); 
     // Your vertex things.. 
} 

если this-> texture_buffer представляет сгенерированную текстуру буфер, например, кстати, что вы делаете, это странно, вы выделения GLuint * массив? Я предпочел бы рекомендовать вам это:

void Object::loadTexture() 
{ 
    glGenTextures(1, &this->texture_buffer); 
    glBindTexture(GL_TEXTURE_2D, this->texture_buffer); 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, 
        texture->sizeX, 
        texture->sizeY, 
        0, GL_RGB, GL_UNSIGNED_BYTE, 
        texture->data); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
} 

Надеется, что это помогает :)

PS: Если вы хотите знать, почему только применяются последняя текстура, это потому, что OpenGL работает таким образом, что он втягивает то, что вы хотите, чтобы он рисовал, благодаря активированным в настоящий момент текстурам, огни ... и в качестве последнего вызова object1-> draw() вызывает последний loadtexture(), который активирует вашу последнюю текстуру, вызывая glBindTexture().