在OpenGL的片段着色器中使用mtl信息进行纹理映射
在我的程序中,我加载.obj模型。现在我想在我的模型中使用.mtl。我已经解析了所有属性(包括纹理文件名-实际上我只想将纹理映射到我的模型)。我猜照明和纹理贴图将在片段着色器中完成。但我很困惑,我如何将所有材质信息传递给我的着色器 我有一个包含所有值的struct MaterialMTL,但我知道如何在vbo中保存它。也许我必须对从.mtl解析的所有材质创建一个向量,并将索引保存在网格中?但我仍然不知道如何将所有属性传递给着色器,也不知道如何知道是否必须为当前片段使用特定材质,我的模型有一个网格,如果我只想为特定片段使用材质该怎么办 我找不到任何关于在OpenGL中使用mtl的信息,即使只是映射纹理,所以我真的非常感谢任何帮助 以下是我代码的一部分:在OpenGL的片段着色器中使用mtl信息进行纹理映射,opengl,mesh,texture-mapping,wavefront,mtl-file,Opengl,Mesh,Texture Mapping,Wavefront,Mtl File,在我的程序中,我加载.obj模型。现在我想在我的模型中使用.mtl。我已经解析了所有属性(包括纹理文件名-实际上我只想将纹理映射到我的模型)。我猜照明和纹理贴图将在片段着色器中完成。但我很困惑,我如何将所有材质信息传递给我的着色器 我有一个包含所有值的struct MaterialMTL,但我知道如何在vbo中保存它。也许我必须对从.mtl解析的所有材质创建一个向量,并将索引保存在网格中?但我仍然不知道如何将所有属性传递给着色器,也不知道如何知道是否必须为当前片段使用特定材质,我的模型有一个网格
void drawMesh(struct Mesh m) {
glBindVertexArray(m.vao);
glDrawArrays(GL_TRIANGLES, 0, m.vert_count);
}
Mesh initMesh(const char * path)
{
Mesh m;
vector<vec3> vertsBuff;
vector<vec2> textBuff;
vector<vec3> normBuff;
MaterialMTL material;
loadOBJ(path, vertsBuff, textBuff, normBuff, material); //So here I'm parsing my obj model with the mtl file (I want to have only one material to start with)
glGenVertexArrays(1, &m.vao);
glBindVertexArray(m.vao);
glEnableVertexAttribArray(0);
glGenBuffers(1, &m.id_vert);
glBindBuffer(GL_ARRAY_BUFFER, m.id_vert);
glBufferData(GL_ARRAY_BUFFER, vertsBuff.size() * sizeof(vec3),
&vertsBuff[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 0, NULL);
glEnableVertexAttribArray(1);
glGenBuffers(1, &m.id_text);
glBindBuffer(GL_ARRAY_BUFFER, m.id_text);
glBufferData(GL_ARRAY_BUFFER, textBuff.size() * sizeof(vec2),
&textBuff[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, 0, NULL);
glEnableVertexAttribArray(1);
glGenBuffers(1, &m.id_norm);
glBindBuffer(GL_ARRAY_BUFFER, m.id_norm);
glBufferData(GL_ARRAY_BUFFER, normBuff.size() * sizeof(vec3),
&normBuff[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, 0, NULL);
m.vert_count = vertsBuff.size();
return m;
}
void drawMesh(结构网格m){
glBindVertexArray(m.vao);
GLDRAW阵列(GLU三角形,0,m.vert\u计数);
}
网格初始化网格(常量字符*路径)
{
网格m;
向量向量向量;
向量textBuff;
向量normBuff;
材料TL材料;
loadOBJ(path,vertsBuff,textBuff,normBuff,material);//所以这里我用mtl文件解析我的obj模型(我只想从一种材质开始)
glGenVertexArrays(1和m.vao);
glBindVertexArray(m.vao);
GlenableVertexAttributeArray(0);
glGenBuffers(1和m.id\u vert);
glBindBuffer(GL_数组_BUFFER,m.id_vert);
glBufferData(GL_数组_缓冲区,vertsBuff.size()*sizeof(vec3),
&vertsBuff[0],总图(静态图);
glvertexattributepointer(0,3,GL_FLOAT,GL_TRUE,0,NULL);
GlenableVertexAttributeArray(1);
glGenBuffers(1和m.id_文本);
glBindBuffer(GL_数组_缓冲区,m.id_文本);
glBufferData(GL_数组_缓冲区,textBuff.size()*sizeof(vec2),
&textBuff[0],GL\u STATIC\u DRAW);
glvertexattributepointer(1,3,GL_FLOAT,GL_TRUE,0,NULL);
GlenableVertexAttributeArray(1);
glGenBuffers(1和m.id_norm);
glBindBuffer(GL_数组_BUFFER,m.id_norm);
glBufferData(GL_数组_BUFFER,normBuff.size()*sizeof(vec3),
&normBuff[0],GL\u STATIC\u DRAW);
glvertexattributepointer(1,3,GL_FLOAT,GL_TRUE,0,NULL);
m、 vert_count=vertsBuff.size();
返回m;
}
纹理坐标是中的vt
,这是您需要存储到VBO的内容。在*.mtl
文件中,只有材质灯光属性和纹理名称,因此没有VBO,而是文件名的常量和纹理统一。谢谢你的回答,我会试试看!