OpenGL中.MTL的基本用法

时间:2015-08-10 03:31:44

标签: c++ opengl

我正在解析与我拥有的.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);

1 个答案:

答案 0 :(得分:5)

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

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

查看OBJ文件的USEMTL指令并根据材质分离面,基本上,每当看到USEMTL X时,所有后面的面都将用材质X绘制,直到遇到新的USEMTL Y.

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

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

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

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