我試圖在C++中製作OpenGL引擎,但無法正確呈現網格。網格在渲染時會創建連接網格上兩個隨機點的面,或者使用0,0,0網格上的隨機點。這個問題可以在這裏看到: (我做了一個線框,看問題更清晰)OpenGL繪圖網格不正確
代碼:
// Render all meshes (Graphics.cpp)
for(int curMesh = 0; curMesh < numMesh; curMesh++) {
// Save pointer of buffer
meshes[curMesh]->updatebuf();
Buffer buffer = meshes[curMesh]->buffer;
// Update model matrix
glm::mat4 mvp = Proj*View*(meshes[curMesh]->model);
// Initialize vertex array
glBindBuffer(GL_ARRAY_BUFFER, vertbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*buffer.numcoords*3, meshes[curMesh]->verts, GL_STATIC_DRAW);
// Pass information to shader
GLuint posID = glGetAttribLocation(shader, "s_vPosition");
glVertexAttribPointer(posID, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(posID);
// Check if texture applicable
if(meshes[curMesh]->texID != NULL && meshes[curMesh]->uvs != NULL) {
// Initialize uv array
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*buffer.numcoords*2, meshes[curMesh]->uvs, GL_STATIC_DRAW);
// Pass information to shader
GLuint uvID = glGetAttribLocation(shader, "s_vUV");
glVertexAttribPointer(uvID, 2, GL_FLOAT, GL_FALSE, 0, (void*)(0));
glEnableVertexAttribArray(uvID);
// Set mesh texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, meshes[curMesh]->texID);
GLuint texID = glGetUniformLocation(shader, "Sampler");
glUniform1i(texID, 0);
}
// Actiavte shader
glUseProgram(shader);
// Set MVP matrix
GLuint mvpID = glGetUniformLocation(shader, "MVP");
glUniformMatrix4fv(mvpID, 1, GL_FALSE, &mvp[0][0]);
// Draw verticies on screen
bool wireframe = true;
if(wireframe)
for(int i = 0; i < buffer.numcoords; i += 3)
glDrawArrays(GL_LINE_LOOP, i, 3);
else
glDrawArrays(GL_TRIANGLES, 0, buffer.numcoords);
}
// Mesh Class (Graphics.h)
class mesh {
public:
mesh();
void updatebuf();
Buffer buffer;
GLuint texID;
bool updated;
GLfloat* verts;
GLfloat* uvs;
glm::mat4 model;
};
我的OBJ加載代碼是在這裏:https://www.dropbox.com/s/tdcpg4vok11lf9d/ObjReader.txt(這是相當粗糙和ISN」但仍應該工作)
你可以發佈你的示例文件嗎?你在裝載程序中做了一些假設,這些假設可能會或可能不會被數據所尊重,但沒有數據很難說。 – DirkR
@DirkR也許這可能是問題,這裏是我正在使用的teapot.obj文件:https://www.dropbox.com/s/z8fy46x3zeadg0s/teapot.obj.txt –
嗯,好的,那一個是關於儘可能微不足道,應該有效。所以我的建議是放棄你自己的loader,並使用assimp(http://assimp.sourceforge.net/)來代替,它支持更多的格式並被廣泛使用。 – DirkR