. mtl在OpenGL中的基本用法

Basic Usage of .MTL in OpenGL

本文关键字:用法 OpenGL mtl      更新时间:2023-10-16

我目前正在解析与。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网格的材料的描述。对于每个材质,它指定纹理路径和一些颜色属性,如漫反射和高光颜色。

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

查看OBJ文件的USEMTL指令并根据材料分离面,基本上,每当您看到USEMTL X时,所有以下面的都将使用材料X绘制,直到您遇到新的USEMTL y。

然后,当你绘制时,为每个材质称为MAT:从。mtl文件中为MAT绑定纹理,为MAT设置漫反射和镜面参数,并只绘制那些面。obj说USEMTL MAT。

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

MTL文件可以包含一些更高级的东西,但这应该是你开始。

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