OpenGL载入图片作为纹理

参考资料:《厦门大学计算机图像学教程》第4.1章(附代码)

一、可以使用该教程包装的类用俩个函数来实现图片的导入,

第一个函数支持导入*.BMP,*.EMF,*.GIF,*.ICO,*.JPG和*.WMF

第二个函数用来导入*.TGA格式的图片。


2、我在自己的项目使用过程中,只使用了第一个函数,并把它包装到了自己的类中。

进行了少许修改

①、删掉了“添加/和将路径拼接起来”的那部分代码,因为我的代码可以直接传递完整路径。

但将string路径转为char*用了强制转换。(char*)strFiletexData.c_str()

②、添加了保存原始图片大小变量。以便于后面在纹理映射中的使用(opengl要求纹理图片大小为1,像素坐标必须要除以图片大小)

//原始图像大小赋值
ImgageWidth=lWidthPixels;
ImgageHeight=lHeightPixels;

③、纹理的显示做了部分修改,添加了几个函数

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);


附一:我改的类函数

// 载入图片并转换为纹理
BOOL CtestviewView::BuildTexture(char *szPathName, GLuint &texid)	
{

	MultiByteToWideChar(CP_ACP, 0, szPathName, -1, wszPath, MAX_PATH);		// 把ASCII码转化为Unicode标准码
	HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void**)&pPicture);

	if(FAILED(hr))														// 如果导入失败
	{
		// 图片载入失败出错信息
		MessageBox ("图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION);
		return FALSE;													// 返回 FALSE
	}

	hdcTemp = CreateCompatibleDC(::GetDC(0));	 // 建立窗口设备描述表
	if(!hdcTemp)														// 建立失败?
	{
		pPicture->Release();											// 释放IPicture
		// 图片载入失败出错信息
		MessageBox ("图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION);
		return FALSE;													// 返回 FALSE
	}
	glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);					// 取得支持的纹理最大尺寸
	pPicture->get_Width(&lWidth);										// 取得IPicture 宽度 (转换为Pixels格式)
	lWidthPixels	= MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540);
	pPicture->get_Height(&lHeight);										// 取得IPicture 高度 (转换为Pixels格式)
	lHeightPixels	= MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540);
	
	//原始图像大小赋值
	ImgageWidth=lWidthPixels;
	ImgageHeight=lHeightPixels;
	
	// 调整图片到最好的
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值