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

来源:互联网 发布:域名投资人 编辑:程序博客网 时间:2024/06/06 04:44

注意这里的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);elseglBindTexture(_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


0 0