c++ - vbo 显示相同的对象

标签 c++ opengl vbo

在我的项目中,我想使用 vbo 显示许多对象(球体)。 我设法毫无问题地显示 1 个对象,但是当涉及到 2 个或更多对象时,所有对象 (vbos) 都被最后定义的对象 (vbo) 替换。

CosmicBody(int x)
{
    this->verticesSize=0;
    //this->VaoId=x;
            //this->VaoId=1;
    this->VboId=x;
};

void CosmicBody::InitShape(unsigned int uiStacks, unsigned int uiSlices, float fA, float fB, float fC)
{
float tStep = (Pi) / (float)uiSlices;
float sStep = (Pi) / (float)uiStacks;

float SlicesCount=(Pi+0.0001)/tStep;
float StackCount=(2*Pi+0.0001)/sStep;
this->verticesSize=((int) (SlicesCount+1) * (int) (StackCount+1))*2;

glm::vec4 *vertices=NULL;
vertices=new glm::vec4[verticesSize];
int count=0;


for(float t = -Pi/2; t <= (Pi/2)+.0001; t += tStep)
{
    for(float s = -Pi; s <= Pi+.0001; s += sStep)
    {
        vertices[count++]=glm::vec4(fA * cos(t) * cos(s),fB * cos(t) * sin(s),fC * sin(t),1.0f);
        vertices[count++]=glm::vec4(fA * cos(t+tStep) * cos(s),fB * cos(t+tStep) * sin(s),fC * sin(t+tStep),1.0f);
    }
}

glGenBuffers(1, &VboId);
glBindBuffer(GL_ARRAY_BUFFER, VboId);
glBufferData(GL_ARRAY_BUFFER, 16*verticesSize, vertices, GL_STATIC_DRAW);

glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);

glBindBuffer(GL_ARRAY_BUFFER, VboId);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);




delete[] vertices;
}

void CosmicBody::Draw()
{
glBindBuffer(GL_ARRAY_BUFFER, this->VboId);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_STRIP, 0,this->verticesSize); //when I replace this->verticesSize with number of vertices of last object ,instead of getting x different objects I get same instances of the last one.
glDisableVertexAttribArray(0);
}

最佳答案

当您使用 VAO 时,您应该绑定(bind) VAO 进行绘图,而不是 VBO 缓冲区:

void CosmicBody::Draw()
{
    glBindVertexArray( this->VaoId );  // <-- this is the difference        
    glDrawArrays(GL_TRIANGLE_STRIP, 0,this->verticesSize);
    glBindVertexArray(0);  // unbind the VAO
}

绑定(bind)VAO后,将glEnableVertexAttribArray(0);移动到CosmicBody::InitShape中,无需每次绘制时启用/禁用它:

...
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
glEnableVertexAttribArray(0);  // <-- here
glBindBuffer(GL_ARRAY_BUFFER, VboId);
...

关于c++ - vbo 显示相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387246/

相关文章:

C++ boost - 是否有一个容器像队列一样工作,可以直接访问 key ?

c++ - 智能感知 : too few arguments in function call

c++ - 当我打开文件名在 std::string 中的 fstream 时,为什么会出现 "no matching function"错误?

c - 用于tilemap的VBO(绘制顺序和倾斜的2D航空)

c# - 解压缩 PVRTC

c++ - 只有一种 Material 应用于多个对象

c++ - 使用 gluLookAt 的 OpenGL 相机旋转

c++ - 无法设置顶点着色器中的输入位置

java - 在单独的线程中将 VBO 发送到 GPU

opengl - 我可以在OpenGL中将VAO设置在VBO之前吗?