注意这里的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.youkuaiyun.com/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.youkuaiyun.com/seamanj/article/category/5858361