OpenGL呈现GL_POINTS列表

时间:2014-02-27 01:52:02

标签: opengl opengl-3

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

enter image description here

生成的点列表随每个帧而变化,并在世界空间坐标中定义。我想知道下面的代码我在哪里出错了,在不使用立即模式调用的情况下绘制动态的点列表的最佳实践是什么。大多数在线资源在绘制点时引用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();

}

2 个答案:

答案 0 :(得分:0)

您正在为顶点索引使用缓冲区,但是将索引数组(或者可能是std :: vector的地址?)的地址传递给glDrawElements。当缓冲区绑定到GL_ELEMENT_ARRAY_BUFFER时,glDrawElements的第四个参数是该缓冲区的偏移量,所以在你的情况下你应该传递0:

glDrawElements(GL_POINTS, m_vertex_indices.size(), GL_UNSIGNED_INT, 0);

答案 1 :(得分:0)

你不能这样做:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

通过在之前取消绑定顶点缓冲区,取消绑定顶点数组,告诉顶点数组不要记录适当的缓冲区。当您使用glBindVertexArray(0)取消绑定顶点数组时,状态机应该处于完全状态(关于顶点缓冲区),当您调用glDrawElements时,它将具有它。这意味着您在绘制调用期间没有绑定顶点缓冲区,因此它可能使用随机值(如果您使用glGetError检查可能会生成错误。

尝试交换这两行。