opengl读取obj模型文件 纹理贴图解析错误,求教!

licmue 2014-09-18 05:49:06
]这几天一直在实现opengl加载obj模型,现在进度是:
单纯加载模型无贴图是可以,如下图01


但是加上贴图就变成这样,如下图02(眼是俩黑窟窿有木有,晕啊)

图03


图02 是当我将glTexEnvf()函数第三个参数设为GL_MODULATE时的,图03是设为GL_BLEND时的。
以下是部分代码


//
//绘制函数
//
GLvoid GLObj_Model::glDraw_triangle(GLvoid)
{
std::cout << "checkpoint into glDraw_triangle()... ..." << std::endl;
GLObj_Block *block_pointer = NULL; //指向索引块
GLObj_Triangles *triangle_pointer = NULL; //指向三角形面片数组
block_pointer = obj_root.block_ptr;//指向第一块索引块
while(block_pointer != NULL)
{
//std::cout << "into while() loop ... ..." << std::endl;
//设置材质和纹理贴图
glSet_material_info(block_pointer->material_name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
triangle_pointer = block_pointer->triangles_ptr;//指向本索引块第一个三角形面片
glBegin(GL_TRIANGLES);
for(int i = 0; i < block_pointer->this_block_triangle_num; i++)
{
//第一个顶点
glNormal3fv((triangle_pointer[i]).normal[0]);
glTexCoord2fv((triangle_pointer[i]).texcoord[0]);
glVertex3fv((triangle_pointer[i]).vertex[0]);

//第二个顶点
glNormal3fv((triangle_pointer[i]).normal[1]);
glTexCoord2fv((triangle_pointer[i]).texcoord[1]);
glVertex3fv((triangle_pointer[i]).vertex[1]);

//第三个顶点
glNormal3fv((triangle_pointer[i]).normal[2]);
glTexCoord2fv((triangle_pointer[i]).texcoord[2]);
glVertex3fv((triangle_pointer[i]).vertex[2]);
}
glEnd();
glDisable(GL_TEXTURE_2D);
block_pointer = block_pointer->next;
}
std::cout << "checkpoint leaving glDraw_triangle()... ..." << std::endl;
}

//
//glSet_material_info()函数实现设置当前块(我是按使用相同材质和纹理的三角形面片分块的)的
//材质信息和绑定纹理贴图
//
//mat_name参数为本块所需的材质的材质名,通过材质名在材质信息链表中查找对应的材质和纹理
//
GLvoid GLObj_Model::glSet_material_info(char *mat_name)
{
GLObj_Material *ptr = NULL;//
ptr = obj_root.material_ptr;//指针指向材质信息链表,存储材质信息以及纹理贴图对应的textureID
while(ptr != NULL)
{
if(strcmp(ptr->material_name, mat_name) == 0)//通过mat_name查找
{
break;
}
ptr = ptr->next;
}

if(ptr != NULL) //找到对应的材质信息
{
//std::cout << "checkpoint into glSet_material_info()... ..." << std::endl;
glMaterialfv(GL_FRONT, GL_AMBIENT, ptr->Ka);
glMaterialfv(GL_FRONT, GL_DIFFUSE, ptr->Kd);
glMaterialfv(GL_FRONT, GL_SPECULAR, ptr->Ks);
glMaterialfv(GL_FRONT, GL_SHININESS, &(ptr->Sh));
glMaterialfv(GL_FRONT, GL_EMISSION, ptr->Em);

if(ptr->textureID)
{
glBindTexture(GL_TEXTURE_2D, ptr->textureID);//绑定纹理
}
}
}
...全文
456 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧