使用glDrawArrays()绘制三角形网格 - 三角形的变形

时间:2017-01-25 16:30:47

标签: c++ opengl grid heightmap

我在一个简单的for循环中创建并存储256 * 256网格顶点的位置,如下所示:

ind=0;
for(i=0, i<256, i++){
  for(j=0, j<256, j++){
       vertexPosition[ind].x= i;
       vertexPosition[ind].y= 1.0;
       vertexPosition[ind].z= j;
       ind++;

我使用顶点数组将这些顶点发送到着色器。但是,使用 glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 256*256)

绘制时
glBindVertexArray(0);

我得到以下结果。 enter image description here

据我所知,这与opengl如何绘制三角形有关?我正在逐行创建我的顶点,但似乎这不是opengl如何绘制三角形(显然)。我非常感到高兴,如果有人能指出我在如何让网格正确显示

这是我将顶点信息存储在缓冲区

中的方法
//Terrain Vertex Position
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(3, VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, nrOfVertices * 3 * sizeof(GLfloat), terrainVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), BUFFER_OFFSET(sizeof(glm::vec3) * 0));


//Terrain Normals

glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ARRAY_BUFFER, nrOfVertices * 3 * sizeof(GLfloat), normals, GL_STATIC_DRAW);
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), BUFFER_OFFSET(sizeof(glm::vec3) * 3));



//Terrain UV
glBindBuffer(GL_ARRAY_BUFFER, VBO[2]);
glBufferData(GL_ARRAY_BUFFER, nrOfVertices * 2 * sizeof(GLfloat), uv, GL_STATIC_DRAW);
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), BUFFER_OFFSET(sizeof(glm::vec3) * 6));
glBindVertexArray(0); //End the array here

1 个答案:

答案 0 :(得分:-2)

glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, nrOfVertices * 3 * sizeof(GLfloat), terrainVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT,GL_FALSE, sizeof(glm::vec3), BUFFER_OFFSET(sizeof(glm::vec3) * 0));
                                               ^^^^^^^^^^^^^^^^^

没有。您的顶点缓冲区VBO [0]是XYZXYZXYZ。所以不需要大步迈进。将其设置为0。

如果你的缓冲区是XYZnnXYZnnXYZ,那么stride = 2(两个'n')。

更正:步幅是多个字节。如果您有两个'n'交错并且您正在缓冲区中读取每个值作为浮点数,那么每个XYZ的步幅为2*sizeof(float)  

法线和紫外线相同