Отрисовка текстурированого куба
В поисках более быстрого рендера столкнулся с 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);
};