我目前正在解析与.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);

最佳答案

.OBJ文件随附的MTL文件是对应用于.OBJ网格的 Material 的描述。
对于每种 Material ,它指定纹理路径和多种颜色属性,例如漫反射和镜面反射颜色。

OpenGL并不关心.obj,所以也不关心.MTL,使用数据的方式由您决定。有两种方法可以将.MTL文件中的数据应用于opengl网格。
最简单的方法如下:

查看OBJ文件的USEMTL指令,并基于 Material 分离面,基本上,每当看到USEMTL X时,以下所有面都将用 Material X绘制,直到遇到新的USEMTLY。

然后在绘制时,对于称为MAT的每种 Material :将.MTL文件中的纹理绑定(bind)为MAT,设置MAT的漫反射和镜面反射参数,并仅绘制.OBJ表示USEMTL MAT的那些面。

还有其他一些方法可以提高效率,请在评论中让我知道您当前如何绘制网格,因为这会影响最佳选择。

MTL文件可以包含一些更高级的内容,但这应该可以帮助您入门。

有关MTL文件及其值含义的更多信息,请参见Wavefront .obj file

关于c++ - .MTL在OpenGL中的基本用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31911259/

10-13 04:35