📄 oogltexture.cpp
字号:
}
// Get a new texture name for this texture,
// bind this texture and make it current
glGenTextures(1,&_nTextureID);
glBindTexture(GL_TEXTURE_2D, _nTextureID);
// Define the 2D texture image.
// This is specific to the binary format of the data read in.
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
// glTexImage2D(GL_TEXTURE_2D, 0, 3, _nTextureWidth, _nTextureHeight, 0,
// GL_RGB, GL_UNSIGNED_BYTE, _pBitmapData);
// glTexImage2D(GL_TEXTURE_2D, 0, 3, _nTextureWidth, _nTextureHeight, 0,
// GL_BGR_EXT, GL_UNSIGNED_BYTE, _pBitmapData);
// Uncomment or add a member function to do this if you want mip mapping
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, _nTextureWidth, _nTextureHeight,
GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)(tex));
// We don't need this loaded any more once it has been passed on to OpenGL,
// UNLESS you are going to do the above (build mip maps) latter
if(_pBitmapData)
delete [] (BYTE *) _pBitmapData;
return _bValid;
}
/////////////////////////////////////////////////////////////////////
// Loads a BMP file for use as a texture. The file must be in 24-bit
// format for this version of the texture object. Also the bitmap
// must have dimensions that are a power of two (2 X 2, 4X4, 8X8, 16X16
// 32X32, 64X64, etc.
/////////////////////////////////////////////////////////////////////
BOOL ooglTexture2D::LoadBMPA64(TCHAR* szFileName, int iblend)
{
HANDLE hFileHandle;
BITMAPINFO *pBitmapInfo = NULL;
unsigned long lInfoSize = 0;
unsigned long lBitSize = 0;
GLubyte tex[64][64][4];
char *swap;
char temp;
int i;
// If this load fails, any previously loaded texture
// is no longer valid.
_bValid = FALSE;
// Free pixmap data
if(_pBitmapData)
delete [] _pBitmapData;
// Lose texture ID
if(_nTextureID != 0)
{
glDeleteTextures(1,&_nTextureID);
_nTextureID = 0;
}
// Open the Bitmap file
hFileHandle = CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
// Check for open failure (most likely file does not exist).
if(hFileHandle == INVALID_HANDLE_VALUE)
return FALSE;
// File is Open. Read in bitmap header information
BITMAPFILEHEADER bitmapHeader;
DWORD dwBytes;
ReadFile(hFileHandle,&bitmapHeader,sizeof(BITMAPFILEHEADER),
&dwBytes,NULL);
__try {
if(dwBytes != sizeof(BITMAPFILEHEADER))
return FALSE;
// Check format of bitmap file
if(bitmapHeader.bfType != 'MB')
return FALSE;
// Read in bitmap information structure
lInfoSize = bitmapHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
pBitmapInfo = (BITMAPINFO *) new BYTE[lInfoSize];
ReadFile(hFileHandle,pBitmapInfo,lInfoSize,&dwBytes,NULL);
if(dwBytes != lInfoSize)
return FALSE;
_nTextureWidth = pBitmapInfo->bmiHeader.biWidth;
_nTextureHeight = pBitmapInfo->bmiHeader.biHeight;
lBitSize = pBitmapInfo->bmiHeader.biSizeImage;
if(lBitSize == 0)
lBitSize = (_nTextureWidth *
pBitmapInfo->bmiHeader.biBitCount + 7) / 8 *
abs(_nTextureHeight);
// Allocate space for the actual bitmap
_pBitmapData = (void *)new BYTE[lBitSize];
// Read in the bitmap bits
ReadFile(hFileHandle,_pBitmapData,lBitSize,&dwBytes,NULL);
if(lBitSize != dwBytes)
{
if(_pBitmapData)
delete [] (BYTE *) _pBitmapData;
_pBitmapData = NULL;
return FALSE;
}
}
__finally // Fail or success, close file and free working memory
{
CloseHandle(hFileHandle);
if(pBitmapInfo != NULL)
delete [] (BYTE *)pBitmapInfo;
}
// Once we get this far, we are home free
_bValid = TRUE;
int count = 0;
int x = 0, y = 0;
swap = (char*)_pBitmapData;
for(i=0; i<(int)lBitSize; i+=3)
{
temp = *(swap);
*(swap) = *(swap+2);
*(swap+2) = temp;
tex[count][y][0] = *(swap);
tex[count][y][1] = *(swap+1);
tex[count][y][2] = *(swap+2);
count++;
if(count == 64)
{
count = 0;
y+=1;
}
swap += 3;
}
for(y=0; y<64; y++)
{
for(x=0; x<64; x++)
{
// tex[x][y][0] = _pBitmapData[(y+x*128)*3];
// tex[x][y][1] = _pBitmapData[(y+x*128)*3+1];
// tex[x][y][2] = _pBitmapData[(y+x*128)*3+2];
if((tex[x][y][0]==tex[x][y][1]) && (tex[x][y][1]==tex[x][y][2])&&(tex[x][y][2]==0))
{
tex[x][y][3] = 0;
}else
{
tex[x][y][3] = iblend;
}
}
}
// Get a new texture name for this texture,
// bind this texture and make it current
glGenTextures(1,&_nTextureID);
glBindTexture(GL_TEXTURE_2D, _nTextureID);
// Define the 2D texture image.
// This is specific to the binary format of the data read in.
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
// glTexImage2D(GL_TEXTURE_2D, 0, 3, _nTextureWidth, _nTextureHeight, 0,
// GL_RGB, GL_UNSIGNED_BYTE, _pBitmapData);
// glTexImage2D(GL_TEXTURE_2D, 0, 3, _nTextureWidth, _nTextureHeight, 0,
// GL_BGR_EXT, GL_UNSIGNED_BYTE, _pBitmapData);
// Uncomment or add a member function to do this if you want mip mapping
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, _nTextureWidth, _nTextureHeight,
GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)(tex));
// We don't need this loaded any more once it has been passed on to OpenGL,
// UNLESS you are going to do the above (build mip maps) latter
if(_pBitmapData)
delete [] (BYTE *) _pBitmapData;
return _bValid;
}
/*
BOOL ooglTexture2D::GetBMP(TCHAR* szFileName, GLubyte* uData, int *w, int *h)
{
HANDLE hFileHandle;
BITMAPINFO *pBitmapInfo = NULL;
unsigned long lInfoSize = 0;
unsigned long lBitSize = 0;
char *swap;
char temp;
int i;
// If this load fails, any previously loaded texture
// is no longer valid.
_bValid = FALSE;
// Free pixmap data
if(_pBitmapData)
delete [] _pBitmapData;
// Open the Bitmap file
hFileHandle = CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
// Check for open failure (most likely file does not exist).
if(hFileHandle == INVALID_HANDLE_VALUE)
return FALSE;
// File is Open. Read in bitmap header information
BITMAPFILEHEADER bitmapHeader;
DWORD dwBytes;
ReadFile(hFileHandle,&bitmapHeader,sizeof(BITMAPFILEHEADER),
&dwBytes,NULL);
__try {
if(dwBytes != sizeof(BITMAPFILEHEADER))
return FALSE;
// Check format of bitmap file
if(bitmapHeader.bfType != 'MB')
return FALSE;
// Read in bitmap information structure
lInfoSize = bitmapHeader.bfOffBits - sizeof(BITMAPFILEHEADER);
pBitmapInfo = (BITMAPINFO *) new BYTE[lInfoSize];
ReadFile(hFileHandle,pBitmapInfo,lInfoSize,&dwBytes,NULL);
if(dwBytes != lInfoSize)
return FALSE;
*w = pBitmapInfo->bmiHeader.biWidth;
*h = pBitmapInfo->bmiHeader.biHeight;
lBitSize = pBitmapInfo->bmiHeader.biSizeImage;
if(lBitSize == 0)
lBitSize = (_nTextureWidth *
pBitmapInfo->bmiHeader.biBitCount + 7) / 8 *
abs(_nTextureHeight);
// Allocate space for the actual bitmap
_pBitmapData = (void *)new BYTE[lBitSize];
// Read in the bitmap bits
ReadFile(hFileHandle,_pBitmapData,lBitSize,&dwBytes,NULL);
if(lBitSize != dwBytes)
{
if(_pBitmapData)
delete [] (BYTE *) _pBitmapData;
_pBitmapData = NULL;
return FALSE;
}
}
__finally // Fail or success, close file and free working memory
{
CloseHandle(hFileHandle);
if(pBitmapInfo != NULL)
delete [] (BYTE *)pBitmapInfo;
}
// Once we get this far, we are home free
_bValid = TRUE;
swap = (char*)_pBitmapData;
GLubyte *ptr = uData;
for(i=0; i<(int)lBitSize; i+=3)
{
temp = *(swap);
*(swap) = *(swap+2);
*(swap+2) = temp;
*ptr = *(swap);
*(ptr+1) = *(swap+1);
*(ptr+2)= *(swap+2);
if((*(ptr) == *(ptr+1)) && (*(ptr+1) == *(ptr+2)) && (*(ptr+2) == 0))
{
*(ptr+3) = 0;
}else
{
*(ptr+3) = 255;
}
swap += 3;
ptr +=4;
}
if(_pBitmapData)
delete [] (BYTE *) _pBitmapData;
return _bValid;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -