Отрисовка текстурированого куба

Рейтинг: 0Ответов: 2Опубликовано: 20.04.2015

В поисках более быстрого рендера столкнулся с VBO а если точней с glDrawElements()

И вроде построил куб но вод текстура полностью накладываться отказывается наблюдаю такую картину текстурируются только 2 стороны Передняя(Front) и задняя(Back) Ошибка наложение текстур

Чем инициализирую VBO

    void initVertexDataV2()
    {
        VertexDataV2[0].x=1.0;   VertexDataV2[0].y=1.0;   VertexDataV2[0].z=1.0;
        VertexDataV2[1].x=-1.0;  VertexDataV2[1].y=1.0;   VertexDataV2[1].z=1.0;
        VertexDataV2[2].x=-1.0;  VertexDataV2[2].y=-1.0;  VertexDataV2[2].z=1.0;
        VertexDataV2[3].x=1.0;   VertexDataV2[3].y=-1.0;  VertexDataV2[3].z=1.0;

        VertexDataV2[4].x=1.0;   VertexDataV2[4].y=1.0;   VertexDataV2[4].z=-1.0;
        VertexDataV2[5].x=-1.0;  VertexDataV2[5].y=1.0;   VertexDataV2[5].z=-1.0;
        VertexDataV2[6].x=-1.0;  VertexDataV2[6].y=-1.0;  VertexDataV2[6].z=-1.0;
        VertexDataV2[7].x=1.0;   VertexDataV2[7].y=-1.0;  VertexDataV2[7].z=-1.0;

    }
void initTextureDataV2()
    {
   ///Front/////////////////////////////////////////
    TextureDataV2[0].u = 0.0f; TextureDataV2[0].v = 1.0f;
    TextureDataV2[1].u = 1.0f; TextureDataV2[1].v = 1.0f;
    TextureDataV2[2].u = 1.0f; TextureDataV2[2].v = 0.0f;
    TextureDataV2[3].u = 0.0f; TextureDataV2[3].v = 0.0f;
     ///Back//////////////////////////////////////////
    TextureDataV2[4].u = 0.0f; TextureDataV2[4].v = 1.0f;
    TextureDataV2[5].u = 1.0f; TextureDataV2[5].v = 1.0f;
    TextureDataV2[6].u = 1.0f; TextureDataV2[6].v = 0.0f;
    TextureDataV2[7].u = 0.0f; TextureDataV2[7].v = 0.0f;
    ///Left/////////////////////////////////////////////
    TextureDataV2[8].u = 0.0f; TextureDataV2[8].v = 1.0f;
    TextureDataV2[9].u = 1.0f; TextureDataV2[9].v = 1.0f;
    TextureDataV2[10].u = 1.0f; TextureDataV2[10].v = 0.0f;
    TextureDataV2[11].u = 0.0f; TextureDataV2[11].v = 0.0f;
     ///Right////////////////////////////////////////////
    TextureDataV2[12].u = 0.0f; TextureDataV2[12].v = 1.0f;
    TextureDataV2[13].u = 1.0f; TextureDataV2[13].v = 1.0f;
    TextureDataV2[14].u = 1.0f; TextureDataV2[14].v = 0.0f;
    TextureDataV2[15].u = 0.0f; TextureDataV2[15].v = 0.0f;
    ///Top/////////////////////////////////////////////
    TextureDataV2[16].u = 0.0f; TextureDataV2[16].v = 1.0f;
    TextureDataV2[17].u = 1.0f; TextureDataV2[17].v = 1.0f;
    TextureDataV2[18].u = 1.0f; TextureDataV2[18].v = 0.0f;
    TextureDataV2[19].u = 0.0f; TextureDataV2[19].v = 0.0f;
    ///Down//////////////////////////////////////////////
    TextureDataV2[20].u = 0.0f; TextureDataV2[20].v = 1.0f;
    TextureDataV2[21].u = 1.0f; TextureDataV2[21].v = 1.0f;
    TextureDataV2[22].u = 1.0f; TextureDataV2[22].v = 0.0f;
    TextureDataV2[23].u = 0.0f; TextureDataV2[23].v = 0.0f;
    }

void initIndexDataV2()
    {
      ///Front/////////////////////////////////////////
        IndexDataV2[0] = 0;
        IndexDataV2[1] = 1;
        IndexDataV2[2] = 2;

        IndexDataV2[3] = 2;
        IndexDataV2[4] = 3;
        IndexDataV2[5] = 0;
        ///Back//////////////////////////////////////////
        IndexDataV2[6] = 4;
        IndexDataV2[7] = 5;
        IndexDataV2[8] = 6;

        IndexDataV2[9] = 6;
        IndexDataV2[10] = 7;
        IndexDataV2[11] = 4;
        ///Left/////////////////////////////////////////////
        IndexDataV2[12] = 4;
        IndexDataV2[13] = 0;
        IndexDataV2[14] = 3;

        IndexDataV2[15] = 3;
        IndexDataV2[16] = 7;
        IndexDataV2[17] = 4;
        ///Right////////////////////////////////////////////
        IndexDataV2[18] = 5;
        IndexDataV2[19] = 1;
        IndexDataV2[20] = 2;

        IndexDataV2[21] = 2;
        IndexDataV2[22] = 6;
        IndexDataV2[23] = 5;
        ///Top/////////////////////////////////////////////
        IndexDataV2[24] = 4;
        IndexDataV2[25] = 5;
        IndexDataV2[26] = 1;

        IndexDataV2[27] = 1;
        IndexDataV2[28] = 0;
        IndexDataV2[29] = 4;
        ///Down//////////////////////////////////////////////
        IndexDataV2[30] = 7;
        IndexDataV2[31] = 6;
        IndexDataV2[32] = 2;

        IndexDataV2[33] = 2;
        IndexDataV2[34] = 3;
        IndexDataV2[35] = 7;

Процесс построения VBO

glBindTexture(0,texture[0]);

TestVBO.FillingVertexBuffer(VertexDataV2,8);
TestVBO.FillingTextureBuffer(TextureDataV2,24);
TestVBO.FillingIndexBuffer(IndexDataV2,36);
TestVBO.InitVertex();
TestVBO.InitTexture();
TestVBO.InitIndex();

TestVBO.Render();

Класс работы с VBO

class VBOv2
{

    public:

    GLuint idVertexVBO;
    GLuint idTextureVBO;
    GLuint idIndexVBO;
    GLboolean Ready; //Готов к рендерингу ?
    std::vector <Vector3f> VertexBuffer;
    std::vector <GLuint> IndexBuffer;
    std::vector <Texture2f> TextureBuffer;

    VBOv2()
    {
       idVertexVBO = 0 ;
       idTextureVBO= 0 ;
       idIndexVBO  = 0 ;
       Ready = GL_FALSE ; //false
    };

    void InitVertex();

    void InitIndex();

    void InitTexture();

    void FillingVertexBuffer(Vector3f CopyArr[],GLint SizeVector);

    void FillingIndexBuffer(GLuint CopyArr[],GLuint SizeVector);

    void FillingTextureBuffer(Texture2f CopyArr[],GLint SizeVector);

    void Render();

};

void VBOv2::InitVertex()
    {
        glewInit();

        //Создание нового VBO и сохранение идентификатора VBO
        glGenBuffers(1, &idVertexVBO);

        //Установка активности VBO
        glBindBuffer(GL_ARRAY_BUFFER, idVertexVBO);

        //Выгрузка данных вершин в видеоустройство
        glBufferData(GL_ARRAY_BUFFER,VertexBuffer.size()*sizeof(float)*3, &VertexBuffer[0], GL_STATIC_DRAW);
        /*в качестве второго параметра мы задаем размер данного буфера в байтах.*/

        //Рисование треугольника из VBO - происходит каждый раз, когда окно, точка обзора или данные изменяются
        //Устанавливаем 3 координаты каждой вершины с 0 шагом в этом массиве; тут необходимо
        glVertexPointer(3, GL_FLOAT, 0, NULL);

        //Данный массив содержит вершины(не нормалей, цвета, текстуры и т.д.)
        glEnableClientState(GL_VERTEX_ARRAY);

    }

    void VBOv2::InitIndex()
    {
      glGenBuffers( 1, &idIndexVBO );
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idIndexVBO);
      glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * IndexBuffer.size(), &IndexBuffer[0], GL_STATIC_DRAW);
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    }

    void VBOv2::InitTexture()
    {

    //Создание нового VBO и сохранение идентификатора VBO
    glGenBuffers(1, &idTextureVBO);

    //Установка активности VBO
    glBindBuffer(GL_ARRAY_BUFFER, idTextureVBO);

    //Выгрузка данных текстур в видеоустройство
    glBufferData(GL_ARRAY_BUFFER,TextureBuffer.size()*sizeof(float)*2, &TextureBuffer[0], GL_STATIC_DRAW);
    /*в качестве второго параметра мы задаем размер данного буфера в байтах.*/

    glTexCoordPointer(2,GL_FLOAT,0,NULL);

    //Данный массив содержит(текстуры)
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    }
//#include <stdio.h>//Debug
    void VBOv2::FillingVertexBuffer(Vector3f CopyArr[],GLint SizeVector)
    {
        for(GLint i(0);i<SizeVector;)
        {
        VertexBuffer.push_back(Vector3f());
        VertexBuffer[i].x = CopyArr[i].x;
        VertexBuffer[i].y = CopyArr[i].y;
        VertexBuffer[i].z = CopyArr[i].z;
       /// printf("%f %f %f \n",VertexBuffer[i].x,VertexBuffer[i].y,VertexBuffer[i].z); //Debug
        i++;
        }

    };

    void VBOv2::FillingTextureBuffer(Texture2f CopyArr[],GLint SizeVector)
    {
        for(GLint i(0);i<SizeVector;)
        {
        TextureBuffer.push_back(Texture2f());
        TextureBuffer[i].u = CopyArr[i].u;
        TextureBuffer[i].v = CopyArr[i].v;
        //printf("%f %f  \n",TextureBuffer[i].u,TextureBuffer[i].v); //Debug
        i++;
        }

    };

    void VBOv2::FillingIndexBuffer(GLuint CopyArr[],GLuint SizeVector)
    {
        for(GLuint i(0);i<SizeVector;i++)
        {
            IndexBuffer.push_back(GLuint());
            IndexBuffer[i] = CopyArr[i];
        }

    }

    void VBOv2::Render()
    {
    glPushAttrib(GL_ENABLE_BIT);
    glPushMatrix();

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idIndexVBO);
    //Рисование треугольника, указывая количества вершин
    glDrawElements(GL_TRIANGLES,IndexBuffer.size(),GL_UNSIGNED_INT,NULL);//sizeof(float) / 3

    glPopMatrix();
    glPushAttrib(GL_ENABLE_BIT);

    };

Ответы

▲ 3Принят

Боюсь, Вы не верно понимаете использование функции glDrawElements. https://www.opengl.org/sdk/docs/man2/xhtml/glDrawElements.xml Ее смысл в том, что вы указываете массив координат и массив номеров вертексов для построения выбранным способом.

В Вашем случае логичнее использовать glDrawArrays. Попробуйте, по идее, проблема должна решится.

UPDATE:

Для куба ABCDEFGH текстурные координаты должны выглядеть как-то так:введите сюда описание изображения

Но тут проблема с верхней и нижней гранями.

Попробуйте использовать GL_TEXTURE_CUBE_MAP. http://programming4.us/multimedia/3782.aspx http://ogldev.atspace.co.uk/www/tutorial25/tutorial25.html

▲ 1

Переписал входные значения всё гуд

void initVertexDataV2()
{
// Top
VertexDataV2[0].x        = 1;    VertexDataV2[0].y        = 1;    VertexDataV2[0].z        = -1;
VertexDataV2[1].x        = -1;   VertexDataV2[1].y        = 1;    VertexDataV2[1].z        = -1;
VertexDataV2[2].x        = -1;   VertexDataV2[2].y        = 1;    VertexDataV2[2].z        = 1;
VertexDataV2[3].x        = 1;    VertexDataV2[3].y        = 1;    VertexDataV2[3].z        = 1;
// Bottom
VertexDataV2[4].x        = 1;    VertexDataV2[4].y        = -1;   VertexDataV2[4].z        = 1;
VertexDataV2[5].x        = -1;   VertexDataV2[5].y        = -1;   VertexDataV2[5].z        = 1;
VertexDataV2[6].x        = -1;   VertexDataV2[6].y        = -1;   VertexDataV2[6].z        = -1;
VertexDataV2[7].x        = 1;    VertexDataV2[7].y        = -1;   VertexDataV2[7].z        = -1;
// Front
VertexDataV2[8].x        = 1;    VertexDataV2[8].y        = 1;    VertexDataV2[8].z        = 1;
VertexDataV2[9].x        = -1;   VertexDataV2[9].y        = 1;    VertexDataV2[9].z        = 1;
VertexDataV2[10].x       = -1;   VertexDataV2[10].y       = -1;   VertexDataV2[10].z       = 1;
VertexDataV2[11].x       = 1;    VertexDataV2[11].y       = -1;   VertexDataV2[11].z       = 1;
// Back
VertexDataV2[12].x       = 1;    VertexDataV2[12].y       = -1;   VertexDataV2[12].z       = -1;
VertexDataV2[13].x       = -1;   VertexDataV2[13].y       = -1;   VertexDataV2[13].z       = -1;
VertexDataV2[14].x       = -1;   VertexDataV2[14].y       = 1;    VertexDataV2[14].z       = -1;
VertexDataV2[15].x       = 1;    VertexDataV2[15].y       = 1;    VertexDataV2[15].z       = -1;
// Left
VertexDataV2[16].x       = -1;   VertexDataV2[16].y       = 1;    VertexDataV2[16].z       = 1;
VertexDataV2[17].x       = -1;   VertexDataV2[17].y       = 1;    VertexDataV2[17].z       = -1;
VertexDataV2[18].x       = -1;   VertexDataV2[18].y       = -1;   VertexDataV2[18].z       = -1;
VertexDataV2[19].x       = -1;   VertexDataV2[19].y       = -1;   VertexDataV2[19].z       = 1;
// Right
VertexDataV2[20].x       = 1;    VertexDataV2[20].y       = 1;    VertexDataV2[20].z       = -1;
VertexDataV2[21].x       = 1;    VertexDataV2[21].y       = 1;    VertexDataV2[21].z       = 1;
VertexDataV2[22].x       = 1;    VertexDataV2[22].y       = -1;   VertexDataV2[22].z       = 1;
VertexDataV2[23].x       = 1;    VertexDataV2[23].y       = -1;   VertexDataV2[23].z       = -1;
}

void initTextureDataV2()
{
// Top
TextureDataV2[0].u             = 0;    TextureDataV2[0].v       = 0;
TextureDataV2[1].u             = 0;    TextureDataV2[1].v       = 1;
TextureDataV2[2].u             = 1;    TextureDataV2[2].v       = 1;
TextureDataV2[3].u             = 1;    TextureDataV2[3].v       = 0;
// Bottom
TextureDataV2[4].u             = 0;    TextureDataV2[4].v       = 0;
TextureDataV2[5].u             = 0;    TextureDataV2[5].v       = 1;
TextureDataV2[6].u             = 1;    TextureDataV2[6].v       = 1;
TextureDataV2[7].u             = 1;    TextureDataV2[7].v       = 0;
// Front
TextureDataV2[8].u             = 0;    TextureDataV2[8].v       = 0;
TextureDataV2[9].u             = 0;    TextureDataV2[9].v       = 1;
TextureDataV2[10].u            = 1;    TextureDataV2[10].v      = 1;
TextureDataV2[11].u            = 1;    TextureDataV2[11].v      = 0;
// Back
TextureDataV2[12].u            = 0;    TextureDataV2[12].v            = 0;
TextureDataV2[13].u            = 0;    TextureDataV2[13].v            = 1;
TextureDataV2[14].u            = 1;    TextureDataV2[14].v            = 1;
TextureDataV2[15].u            = 1;    TextureDataV2[15].v            = 0;
// Left
TextureDataV2[16].u            = 0;    TextureDataV2[16].v            = 0;
TextureDataV2[17].u            = 0;    TextureDataV2[17].v            = 1;
TextureDataV2[18].u            = 1;    TextureDataV2[18].v            = 1;
TextureDataV2[19].u            = 1;    TextureDataV2[19].v            = 0;
// Right
TextureDataV2[20].u            = 0;    TextureDataV2[20].v            = 0;
TextureDataV2[21].u            = 0;    TextureDataV2[21].v            = 1;
TextureDataV2[22].u            = 1;    TextureDataV2[22].v            = 1;
TextureDataV2[23].u            = 1;    TextureDataV2[23].v            = 0;
}

void initIndexDataV2()
{
    // 1      2
    // +------+
    // |      |
    // |      |
    // +------+
    // 0      3
    IndexDataV2[0] = 0;   IndexDataV2[1] = 1;   IndexDataV2[2] = 2;
    IndexDataV2[3] = 2;   IndexDataV2[4] = 3;   IndexDataV2[5] = 0;

    IndexDataV2[6] = 4;   IndexDataV2[7] = 5;   IndexDataV2[8] = 6;
    IndexDataV2[9] = 6;   IndexDataV2[10] = 7;  IndexDataV2[11] = 4;

    IndexDataV2[12] = 8;  IndexDataV2[13] = 9;  IndexDataV2[14] = 10;
    IndexDataV2[15] = 10; IndexDataV2[16] = 11; IndexDataV2[17] = 8;

    IndexDataV2[18] = 12; IndexDataV2[19] = 13; IndexDataV2[20] = 14;
    IndexDataV2[21] = 14; IndexDataV2[22] = 15; IndexDataV2[23] = 12;

    IndexDataV2[24] = 16; IndexDataV2[25] = 17; IndexDataV2[26] = 18;
    IndexDataV2[27] = 18; IndexDataV2[28] = 19; IndexDataV2[29] = 16;

    IndexDataV2[30] = 20; IndexDataV2[31] = 21; IndexDataV2[32] = 22;
    IndexDataV2[33] = 22; IndexDataV2[34] = 23; IndexDataV2[35] = 20;
}