OpenGL渲染GL_点列表

OpenGL渲染GL_点列表,opengl,opengl-3,Opengl,Opengl 3,我目前正试图在屏幕上渲染一系列点,但我得到的只是以下内容,一个随着我的相机移动并停留在屏幕中心的点 生成的点列表随每个帧而变化,并在世界空间坐标中定义。我想知道下面的代码哪里出了问题,以及在不使用即时模式调用的情况下绘制这样的点的动态列表的最佳实践是什么。大多数在线资源在绘制点时参考glBegin和glEnd void RenderPoints(const CamInfo & camInfo, const std::vector<vec4>& listofpoint

我目前正试图在屏幕上渲染一系列点,但我得到的只是以下内容,一个随着我的相机移动并停留在屏幕中心的点

生成的点列表随每个帧而变化,并在世界空间坐标中定义。我想知道下面的代码哪里出了问题,以及在不使用即时模式调用的情况下绘制这样的点的动态列表的最佳实践是什么。大多数在线资源在绘制点时参考glBegin和glEnd

 void RenderPoints(const CamInfo & camInfo, const std::vector<vec4>& listofpoints )
{
Shader->Use();
Shader->setUniform("MVP",camInfo.proj * camInfo.view);
Shader->setUniform("Color",glm::vec3(0.0f,1.0f,1.0f));
glGenVertexArrays( 1, &M_VAO );
glBindVertexArray( M_VAO );


glGenBuffers( 1, &M_VBO );
glBindBuffer( GL_ARRAY_BUFFER, M_VBO ); 
glBufferData( GL_ARRAY_BUFFER, listofpoints.size()*sizeof(glm::vec4), NULL, GL_STATIC_DRAW );
glBufferSubData( GL_ARRAY_BUFFER, 0,  listofpoints.size()*sizeof(glm::vec4), (const GLvoid*)(&listofpoints[0]) );
GLuint pos_location = glGetAttribLocation(Shader->GetProgramID(), "position");
glEnableVertexAttribArray(pos_location ); 
glVertexAttribPointer( pos_location, 4, GL_FLOAT, GL_FALSE, 0, 0 );
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glGenBuffers(1, &M_IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, M_IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_vertex_indices.size()*sizeof(GLuint), (const GLvoid*)(&m_vertex_indices[0]), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glPointSize(10.0f);
glBindVertexArray(M_VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, M_IBO);
glDrawElements(GL_POINTS,m_vertex_indices.size(),GL_UNSIGNED_INT,&m_vertex_indices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
glBindVertexArray(0);
Shader->Disable();

}

您正在为顶点索引使用缓冲区,但要将地址传递给索引数组或std::vector的地址?对元素进行分类。当一个缓冲区绑定到GL_ELEMENT_ARRAY_buffer时,GL抽屉元素的第四个参数是该缓冲区的偏移量,因此在您的情况下,应该传递0:

glDrawElements(GL_POINTS, m_vertex_indices.size(), GL_UNSIGNED_INT, 0);
你不能这样做:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
通过在解除绑定顶点数组之前解除绑定顶点缓冲区,可以告诉顶点数组不要记录适当的缓冲区。使用glBindVertexArray0解除顶点数组的绑定时,状态机的顶点缓冲区状态应与调用GLDrawerElements时的状态完全相同。这意味着您在draw调用期间没有顶点缓冲区绑定,因此它可能使用随机值,如果您使用glGetError进行检查,则可能会生成错误


尝试交换这两行。

您应该调试更多。将颜色设置为青色0,1,1,但圆点为白色。这真令人费解。也许你的尺度或矩阵是错误的。