⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 texture.cpp

📁 《OpenGL游戏编程》这本书的配套源码。
💻 CPP
字号:
//========================================================
/**
*  @file      Texture.cpp
*
*  项目描述: 构造游戏引擎
*  文件描述:  纹理类
*  适用平台: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  电子邮件:  wwboss123@gmail.com
*  创建日期: 2007-07-26	
*  修改日期: 2007-07-26
*
*/ 
//========================================================
#include "stdafx.h"
#include "Texture.h"

#define POWER0 8


CTexture::CTexture(void)
{
	m_pImageData = NULL;
}

CTexture::~CTexture(void)
{
//	glDeleteTextures(3 , &tex[0]);
	if(m_pImageData)
	{
		delete m_pImageData;
		m_pImageData = NULL;
	}
}

BOOL CTexture::InitTexture(char *filename,BOOL bAlpha,BOOL bTga)
{
	GetImageData(filename,bAlpha,bTga);
	if(m_pImageData == NULL) return FALSE;
	glGenTextures(3 , &tex[0]);
	//create nearest filtered texture
	glBindTexture(GL_TEXTURE_2D , tex[0]);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
	glTexImage2D(GL_TEXTURE_2D, 0, color_type, m_iWidth , m_iHeight, 0, color_format, GL_UNSIGNED_BYTE, m_pImageData);
	//create linear filtered texture
	glBindTexture(GL_TEXTURE_2D , tex[1]);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, color_type , m_iWidth , m_iHeight , 0, color_format, GL_UNSIGNED_BYTE, m_pImageData);
	//create MipMapped texture
	glBindTexture(GL_TEXTURE_2D, tex[2]);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
	gluBuild2DMipmaps(GL_TEXTURE_2D, color_type , m_iWidth , m_iHeight , color_format , GL_UNSIGNED_BYTE, m_pImageData);

	if(m_pImageData)
	{
		delete m_pImageData;
		m_pImageData = NULL;
	}

	return TRUE;
}


int CTexture::GetPower(int iSize)
{
	if(iSize < POWER0) return -1;
	int iVal = POWER0;
	if(iSize == iVal) return iSize;
	while(iSize > iVal)
	{
		iVal = 2 * iVal;
	}

	return iVal;
}


void CTexture::GetImageData(char *filename,BOOL bAlpha,BOOL bTga)
{
	unsigned char r,g,b;
	r = 0;g=0;b=0;
	m_pImage = new CImage;

	if(m_pImage == NULL)return;
	
	if(bAlpha)
	{
		color_type = GL_RGBA8;
		color_format = GL_RGBA;
	}
	else
	{
		color_type = GL_RGB8;
		color_format = GL_RGB;
	}
	
	if(bTga)
	{
		if(bAlpha) m_pImage->LoadTgaWithAlpha(filename , RGB(r,g,b));
		else m_pImage->LoadTga(filename);
	}
	else
	{
		if(bAlpha) m_pImage->LoadBitmapWithAlpha(filename , RGB(r,g,b));
		else m_pImage->LoadBitmap(filename);
	}
	
	unsigned char *pImage = m_pImage->GetImageData();
	if(pImage == NULL) return;

	m_iWidth	= GetPower(m_pImage->GetWidth());
	m_iHeight	= GetPower(m_pImage->GetHeight());
	if(m_iWidth == m_pImage->GetWidth() && m_iHeight == m_pImage->GetHeight())
		bScale = FALSE;
	else
		bScale = TRUE;
	fScaleWidth	= ((float)m_pImage->GetWidth()) / ((float)m_iWidth);
	fScaleHeight= ((float)m_pImage->GetHeight())/((float)m_iHeight);
	if(!bScale)
	{

		fScaleWidth = 1.0f;
		fScaleHeight = 1.0f;
	}
	int iImageHeight;
	int iColor;
	if(bAlpha) iColor = 4;
	else iColor = 3;
	m_pImageData = new unsigned char[m_iWidth * m_iHeight * iColor];
	
	if(m_pImageData == NULL)return;

	unsigned char *p , *q;
	p = m_pImageData;
	q = pImage;
	for(iImageHeight = 0 ; iImageHeight < m_pImage->GetHeight() ; iImageHeight++)
	{
		memcpy(p , q , m_pImage->GetWidth() * iColor);
		p += m_iWidth * iColor;
		q += m_pImage->GetWidth() * iColor;
	}

	delete m_pImage;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -