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<float>
相同,与向量数据的大小无关。
你要做的就是传递向量中存储的数据的实际大小,如下所示:
glBufferData(
GL_ARRAY_BUFFER,
bufferData.size() * sizeof(float),
&bufferData.front(),
GL_STATIC_DRAW);
【讨论】:
以上是关于Cylinder VBO OpenGL:我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章