OpenGl с C++ - текстуры

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

        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
}

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

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 ответ

При использовании непосредственного режима (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 лет?

Другие вопросы по тегам