Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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();
- };
- ////////////////////////VBO//2//Порядка/////////////////////////////////
- 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("Itereted %d: %f %f %f \n",i,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);
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement