Я создаю и сохраняю положение вершин сетки 256 * 256 в простом цикле for, например:
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);
Я получаю следующий результат.
Я понимаю, что это связано с тем, как 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
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, тогда шаг = 2 (два ‘n’).
Исправление: Шаг — это количество байтов. Если у вас есть два ‘n’ с чередованием, и вы читаете каждый вейл в буфере как число с плавающей запятой, то шаг для каждого XYZ будет 2*sizeof(float)
То же самое для нормалей и УФ
Других решений пока нет …