2015-06-14 4 views
1

Я пытаюсь отобразить некоторые текстуры в OpenGl на грань куба. Но, когда я запускаю свою программу, моя текстура не появляется. Таким образом, у меня есть этот блок кода:OpenGl с C++ - Текстуры

 glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D,texture[1]); 

     glPushMatrix(); 

     glBegin(GL_QUADS);         // Begin drawing the color cube with 6 quads 
                  // Top face (y = 1.0f) 
                  // Define vertices in counter-clockwise (CCW) order with normal pointing out 
     //glColor3f(0.0f, 1.0f, 0.0f);  // Green 
     glVertex3f(1.0f+i*2, -2.0f+y*2, -1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -2.0f+y*2, -1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
     glVertex3f(1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 

                  // Bottom face (y = -1.0f) 
     //glColor3f(1.0f, 0.5f, 0.0f);  // Orange 
     glVertex3f(1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 
     glVertex3f(1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 

                  // Front face (z = 1.0f) 
     //glColor3f(1.0f, 0.0f, 0.0f);  // Red 
     glTexCoord2f(0.0f,0.0f); glVertex3f(1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
     glTexCoord2f(10.0f,0.0f); glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
     glTexCoord2f(10.0f,10.0f); glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 
     glTexCoord2f(0.0f,10.0f); glVertex3f(1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 

                  // Back face (z = -1.0f) 
     //glColor3f(1.0f, 1.0f, 0.0f);  // Yellow 
     glVertex3f(1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -2.0f+y*2, -1.0f+j*2); 
     glVertex3f(1.0f+i*2, -2.0f+y*2, -1.0f+j*2); 

                  // Left face (x = -1.0f) 
     //glColor3f(0.0f, 0.0f, 1.0f);  // Blue 
     glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -2.0f+y*2, -1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 
     glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 

                  // Right face (x = 1.0f) 
     //glColor3f(1.0f, 0.0f, 1.0f);  // Magenta 
     glVertex3f(1.0f+i*2, -2.0f+y*2, -1.0f+j*2); 
     glVertex3f(1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
     glVertex3f(1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 
     glVertex3f(1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 
     glEnd();           // End of drawing color-cube 

     glPopMatrix(); 

     glDisable(GL_TEXTURE_2D); 

Моя функция Init заключается в следующем:

void initGL() { 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);      // Set background color to black and opaque 
    glShadeModel(GL_SMOOTH);         // Enable smooth shading 
    cria_texturas(); 
glEnable(GL_TEXTURE_2D); 
    //glClearDepth(1.0f);           // Set background depth to farthest 
    glEnable(GL_DEPTH_TEST);         // Enable depth testing for z-culling 
    //glDepthFunc(GL_LEQUAL);          // Set the type of depth-test 
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   // Nice perspective corrections 
} 

Чтобы загрузить текстуру, я написал этот код, который использует Premade класс, который загружает изображение:

glGenTextures(1, &texture[0]); 
glBindTexture(GL_TEXTURE_2D, texture[1]); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
imag.LoadBmpFile("chao.bmp"); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, 
      imag.GetNumCols(), 
      imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, 
      imag.ImageData()); 

Так что я не понимаю, почему текстура не отображается в грани куба. Вы можете мне помочь?

+1

Вы создаете одну текстуру для 'texture [0]', а затем используете 'texture [1]'. Вы должны использовать 'texture [0]' в 'glBindTexture'. Кроме того, перед 'cria_texturas()' следует вызвать 'glEnable (GL_TEXTURE_2D)'. – aslg

ответ

-1

При использовании немедленного режима (glBegin, glEnd) вызов glVertex завершает сборку одной единственной вершины. По сути, что glVertex делает, объединяет атрибуты, которые были помещены в другой атрибут «регистры» и отправляет его в буфер.

В своем коде вы следующее:

glTexCoord2f(0.0f,0.0f); glVertex3f(1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
    glTexCoord2f(10.0f,0.0f); glVertex3f(-1.0f+i*2, -2.0f+y*2, 1.0f+j*2); 
    glTexCoord2f(10.0f,10.0f); glVertex3f(-1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 
    glTexCoord2f(0.0f,10.0f); glVertex3f(1.0f+i*2, -4.0f+y*2, 1.0f+j*2); 

                 // Back face (z = -1.0f) 

    glVertex3f(1.0f+i*2, -4.0f+y*2, -1.0f+j*2); 

Только последние из этого glTexCoord вызовов на самом деле эффект, остальные будут просто установить регистр, но значение получает сразу перезаписи стартового следующие вызовы.

Путь использовать непосредственный режим является

foreach vertex in model: 
    glColor 
    glNormal 
    glTexCoord 
    ... 
    glVertex // must be the last call for specifying a vertex! 

Вы не можете группы glColor, glNormal и другие вызовы. Но тогда вы не должны использовать немедленный режим в любом случае! Он устарел с 1996 года, когда OpenGL-1.1 действительно представил вершинные массивы. Вы действительно настаиваете на использовании технологий, которые устарели почти 20 лет?

+0

За каждым glTexCoord2f следует вызов glVertex3f в той же строке. – aslg

+0

@aslg: Да, но только в некоторых строках. В других вы вообще не касаетесь координаты текстуры. – datenwolf

+0

OP пытается отобразить текстуру только на лицевой панели. Вы не обязательно должны определять текс-координаты для всех вершин, но другие лица окажутся черными, так как у них нет tex-коордов. – aslg