位置: 编程技术 - 正文

OpenGL纹理贴图 JPEG纹理(opengl纹理贴图步骤)

编辑:rootadmin
1.1 JPEG纹理

推荐整理分享OpenGL纹理贴图 JPEG纹理(opengl纹理贴图步骤),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl纹理贴图步骤,opengl纹理贴图实验,opengl纹理贴图实验,opengl纹理贴图图片没有显示,opengl纹理贴图步骤,opengl纹理贴图实验,opengl纹理贴图实例,opengl纹理贴图图片没有显示,内容如对您有帮助,希望把文章链接给更多的朋友!

大型的应用程序特别是游戏程序使用的贴图非常多,如Quake III使用的JPEG和TGA文件就有将近个,其中JPEG文件超过一半,占用近MB。如果都使用BMP&#;式的话,因为没有压缩,占用的空间将大大增加,至少达到MB。因此,JPEG文件作为贴图也是大型程序的选择。

因为JPEG文件是压缩的,使用JPEG文件,必须先进行解码。因为JPEG&#;式已经尽人皆知,所以我们可以自己来写解码器。不过现在Internet上有不少免费的源代码,我们可以借鉴过来,把主要精力集中在我们的OpenGL应用上。我们使用Thomas G. Lane的JPEG程序库,他的Email地址是CHRISDL@PAGESZ.NET,他的代码是免费的,不过你要用于商业用途的话最好给作者打个招呼。

把JPEG代码编译后生成一个jpeg.lib库文件,我们就使用jpeg.lib和jpeglib.h两个文件。

为了使用JPEG纹理映射,我们增加两个函数tImageJPG *LoadJPG(const char *filename)和void DecodeJPG(jpeg_decompress_struct* cinfo, tImageJPG *pImageData)。

其中tImageJPG放在jpeglib.h中定义。

// This stores the important jpeg data

struct tImageJPG

{

int rowSpan;

int sizeX;

int sizeY;

unsigned char *data;

};

我们的程序必须包含jpeglib.h文件,并且将jpeg.lib库文件链接进来。

下面是DecodeJPG的代码,如果需要了解JPEG文件更加详细的信息,可以参考Thomas G. Lane的JPEG源代码库。

void DecodeJPG(jpeg_decompress_struct* cinfo, tImageJPG *pImageData)

{

//读取JPEG文件头

jpeg_read_header(cinfo, TRUE);

// 使用压缩信息开始解压缩

jpeg_start_decompress(cinfo);

// 读取图像大小、像素数据

pImageData->rowSpan = cinfo->image_width * cinfo->num_components;

pImageData->sizeX = cinfo->image_width;

pImageData->sizeY = cinfo->image_height;

//为pImageData->data分配内存

pImageData->data = new unsigned char[pImageData->rowSpan * pImageData->sizeY];

//创建每一行数据的指针

unsigned char** rowPtr = new unsigned char*[pImageData->sizeY];

for (int i = 0; i < pImageData->sizeY; i&#;&#;)

rowPtr[i] = &(pImageData->data[i*pImageData->rowSpan]);

//读取像素数据

int rowsRead = 0;

while (cinfo->output_scanline < cinfo->output_height)

{

rowsRead&#;=jpeg_read_scanlines(cinfo,&rowPtr[rowsRead],

cinfo->output_height-rowsRead);

}

// 释放临时使用的指针

delete [] rowPtr;

// 解压缩结束

jpeg_finish_decompress(cinfo);

}

DecodeJPG()调用的LoadJPG()如下:

tImageJPG *LoadJPG(const char *filename)

{

struct jpeg_decompress_struct cinfo;

tImageJPG *pImageData = NULL; //存放JPEG数据

FILE *pFile;

//打开文件

if((pFile = fopen(filename, "rb")) == NULL)

{

MessageBox(g_hWnd, "Fail to load JPG File!", "Error", MB_OK);

return NULL;

}

// 定义一个错误句柄

jpeg_error_mgr jerr;

//解压缩信息对象指向错误句柄

cinfo.err = jpeg_std_error(&jerr);

// 初始化解压缩对象

jpeg_create_decompress(&cinfo);

//指定数据源

jpeg_stdio_src(&cinfo, pFile);

OpenGL纹理贴图  JPEG纹理(opengl纹理贴图步骤)

//分配内存,用于存放数据

pImageData = (tImageJPG*)malloc(sizeof(tImageJPG));

// 进行解压缩

DecodeJPG(&cinfo, pImageData);

// 释放内存

jpeg_destroy_decompress(&cinfo);

fclose(pFile);

// 返回已经解压缩后的数据

return pImageData;

}

为了能够同时利用BMP和JPG纹理文件,创建纹理函数CreateTextures也需要进行更改。首先增加一个pJpg的指针,用于保存从JPG文件读取的数据。为了避免空文件的传入,要对文件进行一次判断,若为空,就返回FALSE。

然后利用strstr()函数对文件名进行判断,如果是BMP文件则处理流程不变,如果是JPG文件,则调用LoadJPG将数据读入pJpg所指的内存。

为了使用pBitmap对纹理进行处理,还要pBitmap也指向这里。在最后之所以没有free(pJpg->data)是因为前面的free(pBitmap->data)已经把两者指向的共同内存释放了。

GLuint CreateTexture(LPSTR strTextureFileName)

{

GLuint tex; //纹理的标识

AUX_RGBImageRec *pBitmap = 0; //存放最终的纹理数据

tImageJPG *pJpg = 0; //存放JPG纹理像素数据

if(!strTextureFileName) //如果文件名为空则返回

{

return FALSE;

}

//根据文件名来判断是哪一种文件

if(strstr(strTextureFileName, ".bmp"))

{

pBitmap = auxDIBImageLoad(strTextureFileName);

}

else if(strstr(strTextureFileName, ".jpg") ||

strstr(strTextureFileName, ".jpeg")) //扩展名可能是jpeg或jpg

{

pJpg = LoadJPG(strTextureFileName);

if(!pJpg) return FALSE;

pBitmap=(AUX_RGBImageRec * )malloc(pJpg->sizeX*pJpg->sizeY&#;8);

pBitmap->data=pJpg->data;

pBitmap->sizeX=pJpg->sizeX; //图像宽度

pBitmap->sizeY=pJpg->sizeY; //图像高度

}

else

return FALSE;

if(!pBitmap)

{

return FALSE;

}

glGenTextures(1, &tex);

glBindTexture(GL_TEXTURE_2D, tex);

glTexImage2D(GL_TEXTURE_2D, 0, 3, pBitmap->sizeX, pBitmap->sizeY,

0, GL_RGB, GL_UNSIGNED_BYTE, pBitmap->data);

if(pBitmap && pBitmap->data)

free(pBitmap->data);

if(pBitmap)

free(pBitmap);

if(pJpg) //pJpg->data已经被释放了

free(pJpg);

return tex; //返回生成纹理的标识

}

在glInit中,将

g_Texture[0] = CreateTexture("baby.bmp")

改为

g_Texture[0] = CreateTexture("girl.jpg"),表示使用girl.jpg文件来创建一个纹理。

glMain不作改动,仍然使用立方体作为纹理的载体。程序运行后,效果如图5-8所示

openCV读入图片,openGL实现纹理贴图 本文结合结合openCV,openGL的优点,实现混合编程。(1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便;(2)OpenGL是跨平台的图

MFC 视图-OpenGL场景-CDialogBar三个界面保存为图片 问题:如图所示的OpenGL场景、View、CDialogBar三个界面的内容保存成图片然后拼合成一张图思路:分四步一、View视图界面保存利用BitBlt函数将界面拷贝到

VS OpenGL MFC 编程问题 1、编译时出现warningC:'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead:右键project-properties-ConfigurationProperties-C/C-Preprocessor-PreprocessorDefinitions,Edit

标签: opengl纹理贴图步骤

本文链接地址:https://www.jiuchutong.com/biancheng/368438.html 转载请保留说明!

上一篇:Android OpenGL ES(五)----进入三维正交投影和透视投影推导

下一篇:openCV读入图片,openGL实现纹理贴图(opencvsharp读取图片)

  • 无形资产摊销完后有余额吗
  • 投标保证金保险怎么买
  • 建设工程劳务分包的规定
  • 公帐的钱可以转给个人私帐可以吗
  • 没有发票的费用可以抵扣企业所得税吗
  • 通行费发票抵扣要勾选认证吗
  • 生产成本月末结转到本年利润里吗
  • 企业卫生费是指什么
  • 原材料被盗计入什么科目
  • 公司代收代付会被监控吗
  • 未使用房子需要交物业费嘛
  • 固定资产的计税基础6种情况
  • 砂石建筑材料验收规范
  • 金税三期啥意思
  • 职工工资个人所得税缴纳标准
  • 物管费开票可以开公司名称吗
  • 专票作废流程是什么意思
  • 普通发票收款方账号信息错了可以正常报销吗
  • 付款时收到应收票据会计分录怎么做?
  • 开票系统维护费必须要交吗
  • 收到不开票的返利如何记账?
  • 仲裁委判决还能上诉吗
  • 地税局完税证明去哪里办理
  • 计提福利费用会计分录
  • 哪些费用可以抵扣进项税吗
  • 应付职工薪酬科目的应用
  • 上月暂估入账的原材料的发票已经送到财务部
  • 附加税享受税收减免的怎么记账
  • msdn原版win7
  • win10专业版问题
  • php字符串操作函数
  • 待机最长的手机智能排行榜 2020
  • 企业记账的主要内容包括
  • 红字发票开具后蓝字发票开具时限的问题
  • 最小的外置dvd刻机多少寸
  • 小规模纳税人应纳增值税额的计算
  • php实现验证码
  • vue面试题及答案2021
  • 申请税控盘流程需要几个工作日
  • 科目汇总表一页不够写怎么办
  • 定期存款怎么入门
  • 分公司非独立核算怎么做账
  • sqlserver数据表在哪里
  • 公司没有车加油费怎么报
  • 汇兑损益的种类
  • 电子税务局如何添加办税人员
  • 普通发票和增值税普通发票一样吗
  • 股东分红要不要纳税?
  • 安全生产费如何计量
  • 核定征收所得税税率是多少
  • 增值税零税率发票怎么开
  • 出口转内销补交进口增值税时间
  • 按季度报税怎么处理
  • etc发票申请流程
  • 形成应收账款的会计分录
  • 软件开发的知识产权有哪些
  • 公司销售部门购买产品
  • 加计抵减四项服务是什么?
  • 营业收入和主营业务收入分别在哪看
  • sqlserver通用的删除服务器上的所有相同后缀的临时表
  • solaris教程
  • 重装系统重启后怎么操作
  • 常见内存大小
  • windows的使用
  • linux建立动态库链接
  • Win7注册表怎么恢复
  • Ubuntu 12.04安装Xen常见问题及解决方法汇总
  • centos发送http请求
  • pm是什么软件的缩写
  • win8安装步骤
  • linux lvm2_member
  • cocos2dx-3.1.1 win8+eclipse+android开发 初学者容易迷惑的两个问题
  • js获取checkbox选中的元素
  • cacls命令怎么运用
  • 手游开发商和发行商有哪些
  • jQuery ajax时间差导致的变量赋值问题分析
  • unity 3d插件
  • javascript基础教学
  • jquery.serialize() 函数语法及简单实例
  • android中的常用布局有哪几种?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设