【发布时间】:2026-02-05 07:55:02
【问题描述】:
我正在尝试在 OpenGL 3.3 中渲染 Suzanne(来自 Blender),但缓冲区数据似乎不正确。我明白了:
https://gyazo.com/ab82f9acb6854a49fccc527ed96cc4e8
我也尝试用简单的纹理渲染一个球体:
https://gyazo.com/85c1e87fcc4eab128ca37b1a0cb1deaa
我的导入器将顶点数据作为单个浮点数插入到 std::vector 中:
if(line.substr(0,2) == "v ")
{
/** Vertex position */
std::istringstream s(line.substr(2));
float v[3];
s >> v[0]; s >> v[1]; s >> v[2];
this->vertices.push_back(v[0]);
this->vertices.push_back(v[1]);
this->vertices.push_back(v[2]);
}
我设置数组缓冲区如下:
glGenBuffers(1, &this->vbo);
glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
glBufferData(GL_ARRAY_BUFFER,
sizeof(float)*(this->vertices.size()+this->textures.size()+this->normals.size()),
NULL,
GL_STATIC_DRAW);
然后我使用 glBufferSubData 插入实际数据
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*this->vertices.size(), this->vertices.data());
glBufferSubData(GL_ARRAY_BUFFER, sizeof(float)*this->vertices.size(), sizeof(float)*this->textures.size(), this->textures.data());
glBufferSubData(GL_ARRAY_BUFFER, sizeof(float)*(this->vertices.size()+this->textures.size()), sizeof(float)*this->normals.size(), this->normals.data());
我也以同样的方式插入索引(当然是 GL_ELEMENT_ARRAY_BUFFER)。
然后我指向信息:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (GLvoid*)0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (GLvoid*)(sizeof(float)*this->v.size()));
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (GLvoid*)(sizeof(float)*this->v.size()+this->vt.size()));
我的顶点着色器接收如下数据:
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
layout(location = 2) in vec3 normals;
我搞砸了偏移量吗?
编辑: 我发现了最大的问题!我编写了一个外部 Lua 程序来将 obj 文件转换为更容易导入的格式,但它最终弄乱了数据并复制了 "f #/#/# #/#/# #/#/ 上的索引#" 所以文件看起来像这样 (x->y->x) 而不是 (x->y->z)
感谢下面的回复,还修复了一些其他错误!
【问题讨论】:
-
好收获!很高兴你能够让它工作。
-
非常感谢您的帮助!现在一切正常。 :D 我意识到当我绘制网格的“线框”时,我使用的是 GL_LINE_LOOP 而不是 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);因此,网格内部的额外面。这是证明:P gyazo.com/928640e745bfe3041798954f3f32079a
标签: c++ opengl buffer opengl-3