我现在往一个模型上(10^4点数级别的网格文件)贴图,通过使用OpenGL中二维纹理映射的方法。贴图的过程是实时与动态的,模型也可以通过鼠标等交互方式变换。模型显示的方法是使用显示列表的方法,因为显示列表中包含对面的判断,如果该面有纹理,则要纹理映射,否则不用。所以当再一次贴图时,显示列表中的内容需要重新建立,这样的时间花费有3~4s左右(目测),这样有点过慢了,不知道有什么解决办法没?还是本来就不应该这样实现?
谢谢!

解决方案 »

  1.   

    for(i = 0; i < face.size(); i++)
    {
    if(HasTexture[i])  glTexCoord2f(...);
    glVertex3f(...);
    }
    这是显示表里的主要内容,HasTexture数组用来标记第i个面是否有纹理,而这个数组时可以动态更新的,也就是说不仅仅是对显示列表进行读的操作,也要有写的操作。
      

  2.   

    区区一万个点,如果没有用shader之类的复杂技术的话,性能方面不应该有任何问题。
    如果数据频繁修改的话,不要用显示列表。其实现在显示列表已经较少有人用了,虽然号称性能最大化,但其灵活性则是最小化,不好用。
    对于OpenGL 1.1以上版本,考虑使用顶点数组(Vertex Array)。
    对于OpenGL 1.5以上版本,考虑使用顶点缓冲(Vertex Buffer Object)。
    如果没有达到对应版本,也可以考虑等效的ARB扩展。例如Intel早些年的显卡,支持OpenGL 1.4,但实际上也可以通过ARB扩展来使用顶点缓冲。楼主可以搜索相关的资料。P.S. 检查一下硬件加速是否真的开启了?
    printf("%s\n", glGetString(GL_RENDERER));
    如果输出的不是你的显卡型号或者显卡驱动版本,那可能就是没有开启硬件加速。此时应该下载最新驱动。