用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);

渲染出来的效果如下:

用GLM来读取显示有纹理的OBJ_第1张图片

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

用GLM来读取显示有纹理的OBJ_第2张图片


源代码在此


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

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


你可能感兴趣的:(GLM:,OBJ,file,library)