2016-08-12 2 views
1

Я пытаюсь нарисовать простой «пол» с сеткой треугольников, но рисуется только первая четверть из них. Например, вот скриншот попытки 5 х 5 сетки:Как рисовать 2D-сетку в 3D?

Ignore the white thing in the corner, it's unrelated.

Я триада несколько различных M x N сетки, это, кажется, рисунок & # x230a; (MxN)/4 & # x230b; квадраты каждый раз.

Таким образом, для 5 х 5 сетки:

int QUAD_DEPTH = 5; 
int QUAD_WIDTH = 5; 
std::vector<GLfloat> vertices; 

Я загружающего вектор; шесть поплавков на вершину (XYZRGB), три вершины на треугольник, два треугольника на квадрат:

for (int row = 0; row < QUAD_WIDTH; row++) { 
    for (int dist = 0; dist < QUAD_DEPTH; dist++) { 
    vertices.push_back(0.0f + row); // X 
    vertices.push_back(0.0f); // Y 
    vertices.push_back(0.0f + dist); // Z 
    vertices.push_back(1.0f); // R 
    vertices.push_back(0.0f); // G 
    vertices.push_back(0.0f); // B 

    vertices.push_back(1.0f + row); // X 
    vertices.push_back(0.0f); // Y 
    vertices.push_back(1.0f + dist); // Z 
    vertices.push_back(0.0f); // R 
    vertices.push_back(1.0f); // G 
    vertices.push_back(0.0f); // B 

    vertices.push_back(1.0f + row); // X 
    vertices.push_back(0.0f); // Y 
    vertices.push_back(0.0f + dist); // Z 
    vertices.push_back(0.0f); // R 
    vertices.push_back(0.0f); // G 
    vertices.push_back(1.0f); // B 

    vertices.push_back(0.0f + row); // X 
    vertices.push_back(0.0f); // Y 
    vertices.push_back(0.0f + dist); // Z 
    vertices.push_back(1.0f); // R 
    vertices.push_back(0.0f); // G 
    vertices.push_back(0.0f); // B 

    vertices.push_back(0.0f + row); // X 
    vertices.push_back(0.0f); // Y 
    vertices.push_back(1.0f + dist); // Z 
    vertices.push_back(0.0f); // R 
    vertices.push_back(1.0f); // G 
    vertices.push_back(0.0f); // B 

    vertices.push_back(1.0f + row); // X 
    vertices.push_back(0.0f); // Y 
    vertices.push_back(1.0f + dist); // Z 
    vertices.push_back(0.0f); // R 
    vertices.push_back(0.0f); // G 
    vertices.push_back(1.0f); // B 
    } 
} 

Тогда я буферные поплавки:

glGenVertexArrays(1, &VAO); 
glGenBuffers(1, &VBO); 

glBindVertexArray(VAO); 
glBindBuffer(GL_ARRAY_BUFFER, VBO); 
glBufferData(GL_ARRAY_BUFFER, vertices.size(), &vertices[0], GL_STATIC_DRAW); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); 
glEnableVertexAttribArray(0); 

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); 
glEnableVertexAttribArray(1); 

glBindVertexArray(0); 

Затем нарисуйте его:

glBindVertexArray(VAO); 
glUniformMatrix4fv(glGetUniformLocation(this->shader->Program, "projection"), 1, GL_FALSE, &projection[0][0]); 
glUniformMatrix4fv(glGetUniformLocation(this->shader->Program, "view"), 1, GL_FALSE, &view[0][0]); 
glUniformMatrix4fv(glGetUniformLocation(this->shader->Program, "model"), 1, GL_FALSE, &this->model_matrix[0][0]); 
glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 
glBindVertexArray(0); 

I также попробовал glDrawArrays(GL_TRIANGLES, 0, vertices.size()/6);, так как есть шесть поплавков на вершину, но он имеет тот же результат.

Я неправильно загружаю или неправильно рисую или это проблема в другом месте?

ответ

2

Проблема с вашим вызовом glBufferData():

glBufferData(GL_ARRAY_BUFFER, vertices.size(), &vertices[0], GL_STATIC_DRAW); 

Второй аргумент имеет размер в байтах, в то время как вы передаете количество поплавков в вашем векторе. Вам нужно умножить размер вектора с размером поплавка, чтобы получить размер в байтах. Например:

glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); 
+0

Awesome, спасибо! – Will