我試圖在OpenGL 3.3中渲染Suzanne(來自Blender),但緩衝區數據似乎並不正確。我得到這個:glBufferData和glBufferSubData Offset
https://gyazo.com/ab82f9acb6854a49fccc527ed96cc4e8
我也試圖呈現一個球體用一個簡單的紋理:
https://gyazo.com/85c1e87fcc4eab128ca37b1a0cb1deaa
我進口商插入頂點數據到一個std ::向量爲單精度浮點:
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)
還修復了其他幾個錯誤,這要歸功於下面的回覆!
好抓!很高興你能夠得到它的工作。 – Exide
非常感謝您的幫助!一切都在工作。 :D我意識到當我繪製網格的「線框」時,我使用的是GL_LINE_LOOP而不是glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);因此,網格內部的額外面。這是證明:P https://gyazo.com/928640e745bfe3041798954f3f32079a – sheep