19,468
社区成员
发帖
与我相关
我的任务
分享
//
//绘制函数
//
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);//绑定纹理
}
}
}