C++ .MTL在OpenGL中的基本用法

C++ .MTL在OpenGL中的基本用法,c++,opengl,C++,Opengl,我目前正在解析与我拥有的.obj文件关联的.mtl文件。我可以正确地渲染模型,但是如何使用.mtl文件呢?我应该把它的价值发送到哪里?我如何使用它?目前,在OpenGL中找不到任何使用.mtl文件的内容。他们只是展示如何解析它 编辑: 这是如何在OpenGL中实现的。我还创建了自己的OBJ解析器。请注意,代码缩短只是为了让您了解我是如何做的 GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint bu

我目前正在解析与我拥有的.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的材质:绑定MAT的.MTL文件中的纹理,设置MAT的漫反射和镜面反射参数,并仅绘制.OBJ表示使用MTL MAT的面

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

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


有关MTL文件以及这些值的含义的详细信息,请参见。

随.OBJ文件一起提供的MTL文件是对应用于.OBJ网格的材质的描述。 对于每个材质,它指定纹理路径和若干颜色属性,如漫反射和镜面反射颜色

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

查看OBJ文件的USEMTL说明并根据材质分离面,基本上,只要看到USEMTL X,以下所有面都将使用材质X绘制,直到遇到新的USEMTL Y

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

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

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


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

我编辑了文章,并查看了我添加的代码。我只想问一下.MTL中的值是否专门用于Kd之类的着色器?关于它没有“特定”的东西:)。Kd值告诉您材质的漫反射照明值。如果需要,您可以忽略它们,并使用未修改的纹理颜色,但它的外观与MTL文件告诉您的外观不同。因此,如果您确实希望在着色器中使用漫反射值,我认为texture2D(texture,texcoord)*Kd会起作用。此外,从您的示例代码来看,如果您希望使用多个材质,那么您的目标是为每个材质调用一个GLDrawArray,因此您还需要为每个调用使用一个单独的缓冲区(或同一缓冲区中的偏移)。然后在两者之间,调用glBindTexture绑定每个材质,并将Kd和其他设置为统一颜色,然后在着色器中执行魔术。这不是很难,但需要对opengl有一定的了解。谢谢。我接受了答案,并将尝试实验材料文件的内容。现在我对它有了一个更清晰的概念,以及它应该如何使用。我已经编辑了这篇文章,并看到了我添加的代码。我只想问一下.MTL中的值是否专门用于Kd之类的着色器?关于它没有“特定”的东西:)。Kd值告诉您材质的漫反射照明值。如果需要,您可以忽略它们,并使用未修改的纹理颜色,但它的外观与MTL文件告诉您的外观不同。因此,如果您确实希望在着色器中使用漫反射值,我认为texture2D(texture,texcoord)*Kd会起作用。此外,从您的示例代码来看,如果您希望使用多个材质,那么您的目标是为每个材质调用一个GLDrawArray,因此您还需要为每个调用使用一个单独的缓冲区(或同一缓冲区中的偏移)。然后在两者之间,调用glBindTexture绑定每个材质,并将Kd和其他设置为统一颜色,然后在着色器中执行魔术。这不是很难,但需要对opengl有一定的了解。谢谢。我接受了答案,并将尝试实验材料文件的内容。现在我对它有了一个更清晰的概念,以及它应该如何使用。