2015-02-13 4 views
1

Каков правильный способ текстуры сопоставить объект в OpenGL 2.1? В настоящий момент я выполняю следующие шаги, но не могу заставить текстуру правильно отображаться на объекте.Как добавить текстуры к объектам буфера вершин в OpenGL (2.1)

  1. Сформировать буфер и хранить идентификатор
  2. свяжи буфера
  3. Загрузить данные в буфер
  4. Каждый раз, когда объект из буфера визуализируется:

    4.1. Включено GL_TEXTURE_2D, GL_VERTEX_ARRAY и GL_TEXTURE_COORD_ARRAY

    4.2. Свяжите текстуру затем связать буфер

    4.3 Настройка glTexCoordPointer затем настроить glVertexPointer

    4.4 Использование glDrawArrays для визуализации объект

    4.5 Вызов glFlush

код для создания VBO:

GLuint flagVBO; 
glGenBuffers(1, &flagVBO); 
glBindBuffer(GL_ARRAY_BUFFER, flagVBO); 
glBufferData(GL_ARRAY_BUFFER, sizeof(flag), (void*) flag, GL_STATIC_DRAW); 

Код для визуализации VBO:

glEnable(GL_TEXTURE_2D); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glBindTexture(GL_TEXTURE_2D, gameManager->getTextureManager().getTexture("poleEndFlag")); //The get texture method returns 2 which is the correct texture 
glColor3f(1.0, 1.0, 1.0); 

glBindBuffer(GL_ARRAY_BUFFER, flagVBO); 
glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*)3); 
glVertexPointer(3, GL_FLOAT, sizeof(float)*5, (GLvoid*)0); 
glDrawArrays(GL_QUADS, 0, sizeof(flag)/sizeof(float)/5); 
glFlush(); 

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisable(GL_TEXTURE_2D); 

flagVBO массив:

flag[120] = { 
    //Bottom 
    -0.1, 1.4, 0.025, 1, 1, 
    -0.8, 1.4, 0.025, 0, 1, 
    -0.8, 1.4, -0.025, 0, 0, 
    -0.1, 1.4, -0.025, 1, 0, 
    //Top 
    -0.1, 1.95, 0.025, 1, 1, 
    -0.8, 1.95, 0.025, 0, 1, 
    -0.8, 1.95, -0.025, 0, 0, 
    -0.1, 1.95, -0.025, 1, 0, 
    //Front 
    -0.1, 1.4, 0.025, 1, 0, 
    -0.8, 1.4, 0.025, 0, 0, 
    -0.8, 1.95, 0.025, 0, 1, 
    -0.1, 1.95, 0.025, 1, 1, 
    //Back 
    -0.1, 1.4, -0.025, 1, 0, 
    -0.8, 1.4, -0.025, 0, 0, 
    -0.8, 1.95, -0.025, 0, 1, 
    -0.1, 1.95, -0.025, 1, 1, 
    //Left 
    -0.8, 1.95, 0.025, 1, 1, 
    -0.8, 1.4, 0.025, 0, 1, 
    -0.8, 1.4, -0.025, 0, 0, 
    -0.8, 1.95, -0.025, 1, 0, 
    //Right 
    -0.1, 1.95, 0.025, 1, 1, 
    -0.1, 1.4, 0.025, 0, 1, 
    -0.1, 1.4, -0.025, 0, 0, 
    -0.1, 1.95, -0.025, 1, 0 
} 

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

The image shows the rendered object on the left and the texture it should have on the right

Изображение показывает обработанную объект слева и текстуры он должен иметь на праве

+0

Вы загружаете изображение в текстуру с помощью 'glTexImage2D'? – Th30n

+0

Да, я. Im довольно уверен, что текстура загружена правильно, потому что объект всегда отображается как основной цвет из того, что когда-либо текстура я пытаюсь использовать. – Tom

ответ

2

указатель текстуры коорд неправильно. Смещение находится в байт. И 3 байта, которые вы указываете, находятся где-то между координатами x и y ваших вершинных позиций. Правильное значение будет

glTexCoordPointer(2, GL_FLOAT, sizeof(float)*5, (GLvoid*) (3*sizeof(GLfloat)));