我目前正在解析与.obj文件关联的.mtl文件。我可以正确地渲染模型,但是如何使用.mtl文件?我应该将其值发送到哪里?如何使用?当前,在OpenGL中找不到使用.mtl文件的任何内容。他们只是展示他们如何解析它。
编辑:这是在OpenGL中的方法。我还创建了自己的OBJ解析器。请注意,代码只是为您简化了我的工作方式而缩短了。
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, cc * sizeof(GLfloat), v, GL_STATIC_DRAW);
GLuint tcbuffer;
glGenBuffers(1, &tcbuffer);
glBindBuffer(GL_ARRAY_BUFFER, tcbuffer);
glBufferData(GL_ARRAY_BUFFER, tcc * sizeof(GLfloat), vt, GL_STATIC_DRAW);
GLuint ncbuffer;
glGenBuffers(1, &ncbuffer);
glBindBuffer(GL_ARRAY_BUFFER, ncbuffer);
glBufferData(GL_ARRAY_BUFFER, ncc * sizeof(GLfloat), vn, GL_STATIC_DRAW);
glEnableVertexAttribArray(m_vert);
glBindBuffer(GL_ARRAY_BUFFER, vbufferid);
glVertexAttribPointer(m_vert, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(m_texcoord);
glBindBuffer(GL_ARRAY_BUFFER, tcbufferid);
glVertexAttribPointer(m_texcoord, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(m_color);
glBindBuffer(GL_ARRAY_BUFFER, cbufferid);
glVertexAttribPointer(m_color, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(m_vertexnormal);
glBindBuffer(GL_ARRAY_BUFFER, ncbufferid);
glVertexAttribPointer(m_vertexnormal, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, vc);
Run Code Online (Sandbox Code Playgroud)
.OBJ文件随附的MTL文件是对应用于.OBJ网格的材质的描述。对于每种材料,它指定纹理路径和多种颜色属性,例如漫反射和镜面反射颜色。
OpenGL并不关心.obj,所以也不关心.MTL,使用数据的方式由您决定。有两种方法可以将.MTL文件中的数据应用于opengl网格。最简单的方法如下:
查看OBJ文件的USEMTL指令,并根据材质分离面,基本上,每当您看到USEMTL X时,以下所有面都将使用材质X进行绘制,直到遇到新的USEMTLY。
然后在绘制时,对于称为MAT的每种材料:将.MTL文件中的纹理绑定为MAT,设置MAT的漫反射和镜面反射参数,并仅绘制.OBJ表示USEMTL MAT的那些面。
还有其他一些方法可以提高效率,请在评论中让我知道您当前如何绘制网格,因为这会影响最佳选择。
MTL文件可以包含一些更高级的内容,但这应该可以帮助您入门。
有关MTL文件及其值含义的更多信息,请参见Wavefront .obj文件。