2015-01-21 7 views
1

Я хочу создать класс mesh с VBO в C++. Класс выглядит следующим образом:OpenGL Vertexbuffer объект текстурные координаты

mesh::mesh(std::vector<Vector3d>* Vertices, std::vector<unsigned int>* Indices, std::vector<Vector2d>* TextureCoords) 
{ 
    if(Vertices) this->vertices = *Vertices; 
    if(Indices) this->indices = *Indices; 
    if(TextureCoords) this->textureCoords = *TextureCoords; 
    chatbox.AddMessageToQueue("vertices.size() : %d", vertices.size()); 
    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(Vector3d) + textureCoords.size()*sizeof(Vector2d), 0, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size()*sizeof(Vector3d), vertices.data()); 
    glBufferSubData(GL_ARRAY_BUFFER, vertices.size()*sizeof(Vector3d), textureCoords.size()*sizeof(Vector2d), textureCoords.data()); 

    glGenBuffers(1, &IND); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IND); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(unsigned int), &indices[0], GL_STATIC_DRAW); 
} 

mesh::~mesh() 
{ 
    glDeleteBuffers(1, &VBO); 
    glDeleteBuffers(1, &IND); 
} 

void mesh::draw() 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 

    glVertexPointer(3, GL_FLOAT, 0, (void*)0); 
    glTexCoordPointer(2, GL_FLOAT, 0, (void*)(sizeof(float)*3*6)); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IND); 
    glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, (unsigned int*)0 + 0); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

Проблема заключается в координаты текстуры только. Я пытаюсь создать сетку, как так:

std::vector<unsigned int> indices; 
std::vector<mesh::Vector3d> vertices; 
std::vector<mesh::Vector2d> texCoords; 

vertices.push_back({PosX, PosY, 1.0}); 
vertices.push_back({PosX + SizeX, PosY, 1.0}); 
vertices.push_back({PosX + SizeX, PosY + SizeY, 1.0}); 
vertices.push_back({PosX, PosY + SizeY, 1.0}); 

indices.push_back(0); 
indices.push_back(1); 
indices.push_back(2); 

indices.push_back(0); 
indices.push_back(2); 
indices.push_back(3); 

texCoords.push_back({0, 1}); 
texCoords.push_back({1, 0}); 
texCoords.push_back({0, 0}); 

texCoords.push_back({0, 1}); 
texCoords.push_back({1, 1}); 
texCoords.push_back({1, 0}); 

gui_checkbox = new mesh(&vertices, &indices, &texCoords); 

Но результат не так, как вы можете видеть на рисунке слева внизу (картина по праву является искомым):

The image on the left side is from VBO, on the right side is immediate mode

Вершины находятся в орто-режиме, поэтому начало координат для вершин находится в верхнем левом углу, а для текстурных координат начало находится в левом нижнем углу, как в OpenGL.

ответ

5

Когда вы используете индексы для обращения к вершинам, координаты текстуры также индексируются. В вашем случае это означает, что вы используете только первые четыре записи в texCoords. Странный взгляд исходит от texCoords [0] == texCoords [3].

Правильные texCoords, скорее всего, будет

texCoords.push_back({0, 1}); 
texCoords.push_back({1, 1}); 
texCoords.push_back({1, 0}); 
texCoords.push_back({0, 0}); 

Они могут быть получены из вершинных координат: texCoords должны иметь одинаковое значение в качестве компонента, когда их соответствующие вершины имеют одинаковое значение компонента. например если вершины [0] .y == вершины [1] .y => texCoords [0] .y == texCoords [1] .y и т. д. Кроме того, координаты texCoords y должны быть перевернуты, так как начало вершины, как сверху, слева, а texcoords начинаются внизу слева.

Edit:

glTexCoordPointer(2, GL_FLOAT, 0, (void*)(sizeof(float)*3*6)); 

не выглядит правильно мне. Этот оператор говорит, что первая координата текстуры начинается после шестого вектора 3, но не должна ли она начинаться после четвертого? (У вас есть только 4 записи в вершинах):

glTexCoordPointer(2, GL_FLOAT, 0, (void*)(sizeof(float)*3*4)); 
+0

Так что мне нужны только 4 текстурных координаты вместо 6? Даже если я использую 'GL_TRIANGLES'? Я попробовал это с 4 текстурными коордами, но это тоже не сработало. – ProXicT

+0

Да, вам нужны только 4 координаты текстуры. Я добавил свое предложение для правильной версии к ответу – BDL

+0

Я тоже пробовал это с 4 tex coords, но это не сработало, поэтому я вернул 6 texcoords. Я думаю, что основная проблема заключается в классе VBO .... – ProXicT

 Смежные вопросы

  • Нет связанных вопросов^_^