mises等效应力:关于OpenGL中的纹理影射

来源:百度文库 编辑:中科新闻网 时间:2024/05/04 03:45:05
毕业设计是实现3D模型的纹理变换,里面的函数太多,一直弄不清楚.
哪位大侠能给出进行纹理映射的基本步骤和相应的函数调用.

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,"ÎÆÀíµÄͼÏó³ß´ç±ØÐëÊÇ2µÄn´ÎÃÝ¡£","Ìáʾ£º",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);
}
//ÉèÖÃÎÆÀí»·¾³£¬È·¶¨ÎÆÀíÌùͼ·½Ê½£¬¼ûÓйذïÖú
// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_DECAL);
wglMakeCurrent(hDC,NULL);

::GlobalUnlock((HGLOBAL) hDIB);
GlobalFree(hDIB);
return true;
}