OpenGL织梦之旅【第三章】第3节.实现截图功能

针对上一章纹理贴图中图片显示不正常的问题,本文介绍了原因及解决方案,主要是由于像素格式差异导致,通过修改LoadTexture函数解决了问题。接着,文章详细讲解了如何使用OpenGL的glReadPixels函数实现屏幕内容保存为BMP文件的截图功能,类似QQ截图。并提供了具体代码示例,读者可以通过调整参数观察不同截图效果。
摘要由CSDN通过智能技术生成

        对于上一章的纹理贴图,不少朋友给我说,有些图片可以成功读取,但是显示不正常。

        例如这只猪:


        解决方案是这样的。造成这个问题的原因是因为像素在bmp图片中保存格式为BGRgluBuild2Dmipmaps函数会要求你提供颜色的组成类型(GL_RGB)而某些OpenGL版本的中并没有GL_BGRGL_BGR_EXT,所以在LoadTexture函数中,我写了个交换器来使其变成RGB,最终使用GL_RGB生成纹理。那么,对于显示不正常的图片,将这个参数改成GL_BGR_EXT即可。

        新的LoadTexture如下:

int LoadBitmap(const char *file)
{
	unsigned int ID;      //纹理的id
	int width,height;   
	byte *image;          //接受图像数据
	FILE *fp;             //文件指针
	BITMAPFILEHEADER FileHeader;     //接受位图文件头
	BITMAPINFOHEADER InfoHeader;     //接受位图信息头
	
	fp=fopen(file,"rb");
	if (fp == NULL)
	{
		printf("Exception: Fail to open file!\n");
		return -1;
	}
	fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
	if(FileHeader.bfType != BITMAP_ID)   //确保文件是一个位图文件,效验文件类型
	{ 
		printf("Exception: This file is not a bmp file!\n");
		fclose(fp);
		return -1;
	}
	fread(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
	width=InfoHeader.biWidth; 
	height=InfoHeader.biHeight;
	InfoHeader.biSizeImage = width*height*3;
	fseek(fp, FileHeader.bfOffBits, SEEK_SET);  //将文件指针移动到实际图像数据处
	image=(byte *)malloc(sizeof(byte)*InfoHeader.biSizeImage); //申请空间
	if (image == NULL)
	{
		free(image);
		printf("Exception: No enough space!\n");
		return -1;
	}
	fread(image, 1, InfoHeader.biSizeImage, fp);
	fclose(fp);  

	glGenTextures(1, &ID);

    glBindTexture(GL_TEXTURE_2D, ID);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEX
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值