用GLM来读取显示有纹理的OBJ

注意这里的GLM不是OPENGL MATHAMATICS LIBRAR——而是an Alias Wavefront OBJ file library,用来操作OBJ文件的一个库,这里用其来读取带纹理的OBJ文件并显示出来


1. 下载GLM库

http://devernay.free.fr/hacks/glm/


此时,最新版本为0.3.2

下载完后,是源码,当我们需要的时候,把这些源码加入我们的工程当中即可


2.由于带纹理的OBJ,需要读取图片文件,我们这里用到了jpeg格式的图片,所以我们需要先配置 libjpeg

配置方法见:http://blog.csdn.net/seamanj/article/details/50631699


3.在项目的预处理定义里面定义:HAVE_LIBJPEG


4.最最重要的一步,我们需要修改一下GLM的原文件


打开glm.c中的glmDraw函数


大概在1966行附近

if(blending == blenditer) {
	if(newmaterial) {
		newmaterial = 0;
		if (mode & GLM_TEXTURE) {
			//if(newtexture) {
			//	newtexture = 0;
				glEnd();
				if(map_diffuse == -1)
					glBindTexture(_glmTextureTarget, 0);
				else
					glBindTexture(_glmTextureTarget, model->textures[map_diffuse].id);

				glBegin(GL_TRIANGLES);
			//}
		}

把如下语句注释掉,这是因为没有纹理的时候, newtexture为0,但是此时需要把_glmTextureTarget绑到0上,即取消绑定,不让画的东西有纹理贴上去。 但如果按原来的代码执行的话,没有纹理的组会调用有纹理组的图片,但是由于程序不会给没有纹理的组画纹理坐标,所以得到的结果是,没有纹理的组取的是纹理的某一点,然后整个没有纹理的组的颜色就是纹理中某点的颜色。



5.在程序中使用,这里只给出关键代码,完整代码见附件

g_model = glmReadOBJ("teeth.obj");
glmDraw(g_model, GLM_SMOOTH|GLM_TEXTURE|GLM_MATERIAL);

渲染出来的效果如下:


如果按照自带的代码来的话,渲染效果如下:



源代码在此


注意,源代码用了AntTweakbar,如何配置它,请看

http://blog.csdn.net/seamanj/article/category/5858361


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值