CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

关于OpenGL中的纹理影射

楼主bluestar8291()2006-06-04 12:01:53 在 VC/MFC / 图形处理/算法 提问

毕业设计是实现3D模型的纹理变换,里面的函数太多,一直弄不清楚.  
  哪位大侠能给出进行纹理映射的基本步骤和相应的函数调用. 问题点数:50、回复次数:2Top

1 楼syy64(太平洋)回复于 2006-06-04 12:20:05 得分 0

bool   CTextureInfo::Bind_RGBA(HDC   hDC,HGLRC   hglrc)  
  {  
  unsigned   char   *   tc;  
  float   *   tD;  
   
  HDIB   hDIB;  
   
  hDIB   =   ZLoadImg(csName);  
  if(hDIB   ==   NULL)   return   false;  
   
  LPSTR   lpDIB   =   (LPSTR)   ::GlobalLock((HGLOBAL)   hDIB);  
  lCol   =   (int)   ::DIBWidth(lpDIB);  
  lRow   =   (int)   ::DIBHeight(lpDIB);      
   
  if((tD   =   new   float[lCol*lRow*4])==NULL)  
  {  
  MessageBox(NULL,"ÄÚ´æ·ÖÅä´íÎó£¡","Ìáʾ£º",MB_OK);  
  GlobalFree(hDIB);  
  return     false;  
  }  
   
  tc   =   (unsigned   char   *)(lpDIB   +   40);  
  for(int   i=0;i<lCol*lRow;i++)  
  {  
  *(tD+i*4)       =   *(tc+i*3+2);  
  *(tD+i*4+1)   =   *(tc+i*3+1);  
  *(tD+i*4+2)   =   *(tc+i*3);  
  *(tD+i*4)       /=   256.0;  
  *(tD+i*4+1)   /=   256.0;  
  *(tD+i*4+2)   /=   256.0;  
  // if(*(tc+i*3)   +   *(tc+i*3+1)   +   *(tc+i*3+2)   <   40   )   *(tD+i*4+3)   =   0.0;  
  if(*(tc+i*3)   <   5   &&   *(tc+i*3+1)   <   5   &&   *(tc+i*3+2)   <   5   )   *(tD+i*4+3)   =   0.0;  
  else   *(tD+i*4+3)   =   1.0;  
  }  
  if((lCol   %   64)   ==   0   &&   (lRow   %   64)   ==   0)  
  {  
  wglMakeCurrent(hDC,hglrc);  
  glGenTextures(1,   &uiBindID);  
  glBindTexture(GL_TEXTURE_2D,   uiBindID);  
  glPixelStorei(GL_UNPACK_ALIGNMENT,   1);  
  glTexParameteri(GL_TEXTURE_2D,   GL_TEXTURE_WRAP_S,lTextureMode);  
  glTexParameteri(GL_TEXTURE_2D,   GL_TEXTURE_WRAP_T,lTextureMode);  
  glTexParameterf(GL_TEXTURE_2D,   GL_TEXTURE_MAG_FILTER,GL_LINEAR);//   GL_NEAREST);  
  glTexParameterf(GL_TEXTURE_2D,   GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);//   GL_NEAREST);  
  gluBuild2DMipmaps(GL_TEXTURE_2D,4,lCol,lRow,GL_RGBA,GL_FLOAT,tD);  
  // glTexEnvf(GL_TEXTURE_ENV,   GL_TEXTURE_ENV_MODE,GL_MODULATE);  
  wglMakeCurrent(hDC,NULL);  
   
  }  
  else    
  {  
  MessageBox(NULL,"&Icirc;&AElig;&Agrave;í&micro;&Auml;&Iacute;&frac14;&Iuml;ó&sup3;&szlig;&acute;&ccedil;±&Oslash;&ETH;&euml;&Ecirc;&Ccedil;2&micro;&Auml;n&acute;&Icirc;&Atilde;&Yacute;&iexcl;&pound;","&Igrave;á&Ecirc;&frac34;&pound;&ordm;",MB_OK);  
  return     false;  
  }  
  delete   tD;  
  ::GlobalUnlock((HGLOBAL)   hDIB);  
  GlobalFree(hDIB);  
  return   true;  
  }  
   
  bool   CTextureInfo::Binding(HDC   hDC,HGLRC   hglrc)  
  {  
  int   Bits,dBits,Bit,UseColor;  
  HDIB   hDIB;  
   
  hDIB   =   ZLoadImg(csName);  
  if(hDIB   ==   NULL)   return   false;  
   
  LPSTR   lpDIB   =   (LPSTR)   ::GlobalLock((HGLOBAL)   hDIB);  
  lCol   =   (int)   ::DIBWidth(lpDIB);  
  lRow   =   (int)   ::DIBHeight(lpDIB);    
  LPBITMAPINFOHEADER     lpbi   =   (LPBITMAPINFOHEADER)lpDIB;  
  Bit     =   lpbi->biBitCount;  
  UseColor   =   lpbi->biClrUsed;  
  if(!UseColor)   UseColor   =   1024;  
  else     UseColor*=   4;  
   
  if(Bit   ==   24)  
  {  
  Bits   =   (lCol*Bit+31)/32   *   4;  
  dBits   =   lCol*3;  
  if(Bits-dBits)  
  {  
  for(int   i=1;i<lRow;i++)  
  {  
  MoveMemory(lpDIB+i*dBits+40,lpDIB+i*Bits+40,dBits);  
  }  
  }  
   
  wglMakeCurrent(hDC,hglrc);  
  glGenTextures(1,   &uiBindID);  
  glBindTexture(GL_TEXTURE_2D,   uiBindID);  
  glPixelStorei(GL_UNPACK_ALIGNMENT,   1);  
  glTexParameteri(GL_TEXTURE_2D,   GL_TEXTURE_WRAP_S,lTextureMode);  
  glTexParameteri(GL_TEXTURE_2D,   GL_TEXTURE_WRAP_T,lTextureMode);  
  glTexParameterf(GL_TEXTURE_2D,   GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);//   GL_NEAREST);  
  glTexParameterf(GL_TEXTURE_2D,   GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);//   GL_NEAREST);  
  if(glIsTexture(uiBindID)!=GL_TRUE)  
  {  
  ::GlobalUnlock((HGLOBAL)   hDIB);  
  GlobalFree(hDIB);  
  return   false;  
  }  
  gluBuild2DMipmaps(GL_TEXTURE_2D,3,lCol,lRow,GL_BGR_EXT,GL_UNSIGNED_BYTE,lpDIB+40);  
  }  
  else   if(Bit   ==   8)  
  {  
  Bits   =   (lCol*Bit+31)/32   *   4;  
  dBits   =   lCol;  
  if(Bits-dBits)  
  {  
  for(int   i=1;i<lRow;i++)  
  {  
  MoveMemory(lpDIB+i*dBits+40+UseColor,lpDIB+i*Bits+40+UseColor,dBits);  
  }  
  }  
   
  wglMakeCurrent(hDC,hglrc);  
  glGenTextures(1,   &uiBindID);  
  glBindTexture(GL_TEXTURE_2D,   uiBindID);  
  glPixelStorei(GL_UNPACK_ALIGNMENT,   1);  
  glTexParameteri(GL_TEXTURE_2D,   GL_TEXTURE_WRAP_S,lTextureMode);  
  glTexParameteri(GL_TEXTURE_2D,   GL_TEXTURE_WRAP_T,lTextureMode);  
  glTexParameterf(GL_TEXTURE_2D,   GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);//   GL_NEAREST);  
  glTexParameterf(GL_TEXTURE_2D,   GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);//   GL_NEAREST);  
  if(glIsTexture(uiBindID)!=GL_TRUE)    
  {  
  ::GlobalUnlock((HGLOBAL)   hDIB);  
  GlobalFree(hDIB);  
  return   false;  
  }  
  gluBuild2DMipmaps(GL_TEXTURE_2D,3,lCol,lRow,GL_LUMINANCE,GL_UNSIGNED_BYTE,lpDIB+40+UseColor);  
  }  
  //&Eacute;è&Ouml;&Atilde;&Icirc;&AElig;&Agrave;í&raquo;·&frac34;&sup3;&pound;&not;&Egrave;·&para;¨&Icirc;&AElig;&Agrave;í&Igrave;ù&Iacute;&frac14;·&frac12;&Ecirc;&frac12;&pound;&not;&frac14;&ucirc;&Oacute;&ETH;&sup1;&Oslash;°&iuml;&Ouml;ú  
  // glTexEnvf(GL_TEXTURE_ENV,   GL_TEXTURE_ENV_MODE,GL_DECAL);  
  wglMakeCurrent(hDC,NULL);  
   
  ::GlobalUnlock((HGLOBAL)   hDIB);  
  GlobalFree(hDIB);  
  return   true;  
  }Top

2 楼soaroc(会飞的猪)回复于 2006-06-04 17:31:56 得分 0

还是推荐你一本书吧,《OpenGL编程指南》,使OpenGL体系结构审核委员会(ARB)编写的,即俗称的红宝书.我个人就得非常的好,基本的概念以及每一个函数的用法以及各个参数的含义都有讲解。Top

相关问题

关键词

得分解答快速导航

  • 帖主:bluestar8291

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo