2016-08-12 1 views
1

J'essaye de dessiner un simple "plancher" avec une grille de triangles, mais seulement le premier quart d'entre eux sont dessinés. Par exemple, voici une capture d'écran d'une tentative d'un 5 x 5 grille:Comment puis-je dessiner une grille 2D en 3D?

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

J'ai Triade quelques différents M x N grilles, il semble être le dessin & # x230a; (MXN)/4 & # x230b; carrés à chaque fois.

Ainsi, pour un 5 x 5 grille:

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

Je suis le chargement d'un vecteur; six flotteurs par sommet (XYZRGB), trois sommets par triangle, deux triangles par carré:

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 
    } 
} 

Je tampon les flotteurs:

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); 

tirer Puis:

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 aussi essayé glDrawArrays(GL_TRIANGLES, 0, vertices.size()/6); puisqu'il y a six flotteurs par sommet, mais il a le même résultat. Est-ce que je tamponne incorrectement ou dessine incorrectement ou est mon problème quelque part ailleurs?

Répondre

2

Le problème est avec votre appel à glBufferData():

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

Le second argument est la taille en octets, alors que vous passez le nombre de flotteurs dans votre vecteur. Vous devez multiplier la taille du vecteur par la taille d'un flottant pour obtenir la taille en octets. Par exemple:

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

Génial, merci! – Will