Cylinder VBO OpenGL:我做错了啥?

Posted

技术标签:

【中文标题】Cylinder VBO OpenGL:我做错了啥?【英文标题】:Cylinder VBO OpenGL: What am I doing wrong?Cylinder VBO OpenGL:我做错了什么? 【发布时间】:2015-11-22 13:57:29 【问题描述】:

我尝试通过将 std::vector 传递给顶点缓冲区而不是 static const GLfloat variableName[]= some data; 来创建圆柱体 VBO .但是,我的窗口中没有绘制任何内容。

我的代码有什么问题?

我的 VBO:

glGenBuffers(1, &vertexbuffer2);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer2);
std::vector<float> bufferData = CreateCylinder();
glBufferData(
    GL_ARRAY_BUFFER,
    sizeof(bufferData),
    &bufferData.front(),
    GL_STATIC_DRAW);

CreateCylinder 方法:

std::vector<float> CreateCylinder()
    std::vector<float> outputArray;
    int i, j, k;
    for (j = 0; j <= 360; j += precision_deg)
        outputArray.push_back(float(cos((pi / 180 * j))));
        outputArray.push_back(1.0);
        outputArray.push_back(float(sin((pi / 180 * j))));
        outputArray.push_back(float(cos((pi / 180 * j))));
        outputArray.push_back(-1.0);
        outputArray.push_back(float(sin((pi / 180 * j))));

    
    for (i = 1; i >= -1; i -= 2)
        outputArray.push_back(0.0);
        outputArray.push_back(float(i));
        outputArray.push_back(0.0);
        for (k = 0; k <= 360; k += precision_deg)
            outputArray.push_back(i*float(cos((pi / 180 * k))));
            outputArray.push_back(float(i));
            outputArray.push_back(float(sin((pi / 180 * k))));
    

return outputArray;

渲染方法:

void RenderScene6()

    glDisable(GL_DEPTH_TEST);
    Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
    View = glm::lookAt(
    glm::vec3(5.63757, 1.7351, -2.19067), 
    glm::vec3(0, 0, 0), 
    glm::vec3(0, 1, 0)  
    );

    Model = glm::mat4(1.0f);

    MVP = Projection * View * Model; 
    glUseProgram(programID_1); 
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer2);
    glVertexAttribPointer(
        0,                  
        3,                  
        GL_FLOAT,           
        GL_FALSE,           
        0,                  
        (void*)0            
        );

glDrawArrays(GL_QUAD_STRIP, 0, 437);
glDrawArrays(GL_TRIANGLE_FAN, 438, 888); //THESE ARE HARDCODED ATM.
glDisableVertexAttribArray(0);

【问题讨论】:

【参考方案1】:

问题是您传递给glBufferData 的大小:sizeof(bufferData)std::vector&lt;float&gt; 相同,与向量数据的大小无关。

你要做的就是传递向量中存储的数据的实际大小,如下所示:

glBufferData(
    GL_ARRAY_BUFFER,
    bufferData.size() * sizeof(float),
    &bufferData.front(),
    GL_STATIC_DRAW);

【讨论】:

以上是关于Cylinder VBO OpenGL:我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 茶壶无法正确绘制。我究竟做错了啥? [关闭]

Firestore - 我做错了啥?

这个Lua代码我做错了啥

单对象 json 解析 - 我做错了啥?

QTreeView 的 QAbstractItemModel:我做错了啥?

矩形跨域请求。我做错了啥?