чертеж openGL GL_LINES, дающий неверный результат - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь нарисовать сетку векторов скорости, я ожидаю, что скорость в каждой точке сетки будет линией с уклоном 1. Косая линия, но я всегда получаю вертикальную линию.Я не уверен, что я делаю неправильно.Есть ли что-то, что я пропускаю?

Вот как выглядит мой буфер вершин:

float vel_pos[6*(N+2)*(N+2)];
int index1 = 0;
for (int i=0;i<N+2;i++)
{
    for (int j=0;j<N+2;j++)
    {
        vel_pos[index1] = float(i);
        vel_pos[index1+1] = float(j);
        vel_pos[index1+2] = 0.0f;
        vel_pos[index1+3] = float(i) +0.5f;
        vel_pos[index1+4] = float(j) + 0.5f;
        vel_pos[index1+5] = 0.0f;
        index1 += 6;
    }
}

Вот как я создаю свои VBO и VAO:

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

// Bind vertex array object first and then bind the vertex buffer objects
glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(vel_pos), vel_pos, GL_STREAM_DRAW);


GLint velAttrib = glGetAttribLocation(ourShader.ID, "aPos");

// iterpreting data from buffer 
glVertexAttribPointer(velAttrib, 3, GL_FLOAT, GL_FALSE,  6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

Вот мой вершинный шейдер:

  out vec4 vertexColor;
  layout (location = 0) in vec3 aPos; 
  layout (location = 1) in float densitySource; /* source of density */
  uniform mat4 transform;
  uniform mat4 projection;

  void main()
  {
  gl_Position = projection*transform * vec4(aPos, 1.0);
  vertexColor = vec4(1, 0.0, 0.0, 1.0);
  }

А вот мой код рисования:

  ourShader.use();

    glm::mat4 trans = glm::mat4(1.0f);
    trans = glm::translate(trans, glm::vec3(-0.5f, -0.5f, 0.0f));
    unsigned int transformMatrixLocation = glGetUniformLocation(ourShader.ID, "transform");
    glUniformMatrix4fv(transformMatrixLocation, 1, GL_FALSE, glm::value_ptr(trans));

    glm::mat4 projection = glm::ortho(-10.0f, 110.0f, -1.0f, 110.0f, -1.0f, 100.0f);

    unsigned int projectionMatrixLocation = glGetUniformLocation(ourShader.ID, "projection");
    glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, glm::value_ptr(projection));

    glBindVertexArray(VAO); 
    glLineWidth(1.0f);
    glDrawArrays(GL_LINES,  0, (N+2)*(N+2));

Это изображение, которое я получаю: Полученное изображение

1 Ответ

0 голосов
/ 08 октября 2018

5-й параметр (stride) glVertexAttribPointer - это смещение между двумя координатами вершины, а не между примитивами.Поскольку ваши координаты вершины имеют 3 компонента типа float, смещение должно быть 3 * sizeof(float):

glVertexAttribPointer(velAttrib, 3, GL_FLOAT, GL_FALSE,  3 * sizeof(float), (void*)0);

Поскольку вы установили смещение 6 * sizeof(float), вы пропустили каждые 2 координаты и нарисовалилинии между точками сетки.

Но учтите, что если stride равно 0, общие атрибуты вершин понимаются как плотно упакованные в массив.Это так, поэтому вы можете использовать смещение 0:

glVertexAttribPointer(velAttrib, 3, GL_FLOAT, GL_FALSE,  0, (void*)0);
...