OPENGL 加载3D模型后的材质问题?

mickyo 2008-11-11 06:35:16


使用OPENGL 加载了个3DS 的模型,读取材质后,原来绘制的图形都变了颜色,真麻烦


////////// 遍历所有的材质
//for(int i = 0; i < g_3DModel.numOfMaterials; i++)
//{
// // 判断是否是一个文件名
// if(strlen(g_3DModel.pMaterials[i].strFile) > 0)
// {
// // 使用纹理文件名称来装入位图
// CreateTexture(g_Texture, g_3DModel.pMaterials[i].strFile, i);
// }

// // 设置材质的纹理ID
// g_3DModel.pMaterials[i].texureId = i;
//}


void BiscuitView::CreateTexture(UINT textureArray[], LPSTR strFileName, int textureID)
{
AUX_RGBImageRec *pBitmap = NULL;

if(!strFileName) // 如果无此文件,则直接返回
return;

pBitmap = auxDIBImageLoadA(strFileName); // 装入位图,并保存数据

if(pBitmap == NULL) // 如果装入位图失败,则退出
exit(0);

// 生成纹理
glGenTextures(1, &textureArray[textureID]);

// 设置像素对齐格式
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pBitmap->sizeX, pBitmap->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pBitmap->data);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);

if (pBitmap) // 释放位图占用的资源
{
if (pBitmap->data)
{
free(pBitmap->data);
}

free(pBitmap);
}
}

可以加载3DS 后不影响原来的图形吗?
...全文
683 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mickyo 2008-11-13
  • 打赏
  • 举报
回复


我已经设置过了,无效

在加载好材质后 glDisable(GL_TEXTURE_2D);

以下是绘制3D的代码

// 遍历模型中所有的对象
//for(int i = 0; i < g_3DModel.numOfObjects; i++)
//{
// // 如果对象的大小小于0,则退出
// if(g_3DModel.pObject.size() <= 0) break;

// // 获得当前显示的对象
// t3DObject *pObject = &g_3DModel.pObject[i];

// // 判断该对象是否有纹理映射
// if(pObject->bHasTexture) {

// // 打开纹理映射
// glEnable(GL_TEXTURE_2D);
// glColor3ub(255, 255, 255);
// glBindTexture(GL_TEXTURE_2D, g_Texture[pObject->materialID]);
// } else
// {
// // 关闭纹理映射
// glDisable(GL_TEXTURE_2D);
// glColor3ub(255, 255, 255);
// }
// // 开始以g_ViewMode模式绘制
// glBegin(GL_TRIANGLES);
// // 遍历所有的面
// for(int j = 0; j < pObject->numOfFaces; j++)
// {
// // 遍历三角形的所有点
// for(int whichVertex = 0; whichVertex < 3; whichVertex++)
// {
// // 获得面对每个点的索引
// int index = pObject->pFaces[j].vertIndex[whichVertex];

// // 给出法向量
// glNormal3f(pObject->pNormals[ index ].x, pObject->pNormals[ index ].y, pObject->pNormals[ index ].z);

// // 如果对象具有纹理
// if(pObject->bHasTexture) {

// // 确定是否有UVW纹理坐标
// if(pObject->pTexVerts) {
// glTexCoord2f(pObject->pTexVerts[ index ].x, pObject->pTexVerts[ index ].y);
// }
// } else {

// if(g_3DModel.pMaterials.size() && pObject->materialID >= 0)
// {
// BYTE *pColor = g_3DModel.pMaterials[pObject->materialID].color;
// glColor3ub(pColor[0], pColor[1], pColor[2]);
// }
// }
// glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z);
// }
// }

// glEnd(); // 绘制结束
//}


照样把原来的图形影响了,在绘制3D前,使用gluSphere绘制了一些小球
无论是把绘制3D的代码放之前还是之后,都一样影响那些小球

可能是我没渲染好,真不知道错在哪里了,急死了。

哪位OPENGL专家能出来交流下
glacier3d 2008-11-12
  • 打赏
  • 举报
回复
设置了某材质后,结下来渲染得所有东西都受该材质影响,除非又设了新的材质
mickyo 2008-11-12
  • 打赏
  • 举报
回复


如何让纹理材质只对某部分图形起作用

我要具体的代码说明,谢谢
mickyo 2008-11-12
  • 打赏
  • 举报
回复


如何渲染
mickyo 2008-11-12
  • 打赏
  • 举报
回复

我对材质不是很懂,能给些代码,说明一下吗?

yale13 2008-11-12
  • 打赏
  • 举报
回复
可以用函数关闭材质,一般是这样的,开材质,设置,画物体,关材质,再开材质,再设置另一种,再画,再关~过程是这样的
glacier3d 2008-11-11
  • 打赏
  • 举报
回复
原来绘制的图形都变了颜色 ------- > 很可能是加载3ds后设了新材质影响的,一般如下做就不会影响原来的图形:

主渲染循环
{
设A的材质和纹理;
渲染A;

设B的材质纹理;
渲染B;
}

19,468

社区成员

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

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