Draw a vector<glm::vec3> opengl c++

3k views Asked by At

I followed a tutorial to build a .obj model with OpenGL.

I have only one problem, at the end, we have a vectorglm::vec3 to draw.

In the tutorial they said to use "glBufferData()"

Then I made that

float* _vertices = new float[vertices.size() * 3];
for (int i = 0; i < vertices.size(); ++i)  
  {     
  float* _t = glm::value_ptr(vertices[i]);
  for (int j = 0; j < 3; ++j)
      _vertices[i + j*(vertices.size() - 1)] = _t[j];
  }

(I converted my vector un float*)

Then I load it:

mat4 projection;
mat4 modelview;
 
projection = perspective(70.0, (double)800 / 600, 1.0, 100.0);
modelview = mat4(1.0);
 
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
 
glBufferData(GL_ARRAY_BUFFER, sizeof(_vertices), _vertices, GL_DYNAMIC_DRAW);

And I finally draw it in my main loop :

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
modelview = lookAt(vec3(3, 1, 3), vec3(0, 0, 0), vec3(0, 1, 0));
 
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
 
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glDisableVertexAttribArray(0);

But it does not work... (I have a black screen)

1

There are 1 answers

0
JKreiser On

sizeof(_vertices) does not give you what you expect. It returns the size of float*, which is a pointer, and not the number of bytes of the data behind the pointer.

Use vertices.data() for the pointer to the first element in the std::vector and 3 * vertices.size() * sizeof(float) as the number of bytes if your vector contains floats (glm::vec3 containes 3 floats).

together like:

glBufferData(GL_ARRAY_BUFFER, 3 * vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);

You can also substitute 3 * sizeof(float) to sizeof(glm::vec3).

Also check if your glm::perspective function expects the field of view as degrees or radians, you currently use 70.0 degrees.