簡體   English   中英

如何在3D中繪制2D網格?

[英]How can I draw a 2D grid in 3D?

我正在嘗試繪制一個帶有三角形網格的簡單“地板”,但是僅繪制了它們的前四分之一。 例如,下面是嘗試5 x 5網格的屏幕截圖:

忽略角落里的白色物體,這是無關的。

我使用了三個不同的M x N網格,似乎每次都繪制⌊(MxN)/4⌋正方形。

因此,對於5 x 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);

我也嘗試了glDrawArrays(GL_TRIANGLES, 0, vertices.size() / 6); 因為每個頂點有六個浮點數,但結果相同。

我是緩沖不正確還是繪制不正確?還是我的問題出在其他地方?

問題在於您對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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM