前面写过Visual Studio C++ 2005中的运行库的文章,没想到问题很快就发生了。以前台式机使用的是VC2003,还是保留了LIBCMT,也就是单线程静态库,大部分小程序也都是链接到这个库下的。刚买了笔记本电脑Acer 5573,安装了一个VC2005,简简单单的跑glut和glew发现有诸多如下问题:
1、glut的命令行和窗口是基于多线程的,但是glut库链接的却是单线程。我的程序链接到了多线程库,导致,如果先关闭OpenGL窗口,命令行主线程不会立刻退出,手动关闭后发现返回值有问题,不是0,而是0xC0000001(好像是的)。如果直接关闭命令行,那么程序会安全的退出,返回0。
2、如果使用了sf.net上提供的预编译好的库,使用GLSL Shader的时候可能会出现问题。当程序退出后,glDetachShader会出现问题,如果你像我一样把关于Shader的撤销操作都封装到了类的析构函数中。原因还是库的问题。
解决的问题很简单,把VC2005默认的链接开关改成/MD就没事了。不过还是有些不放心,毕竟这个线程同步问题可真的是要命。
再论3DS模型格式。lib3ds是个很不错的工具,OGRE都用的它。不过我发现为了支持Vertex Buffer Object的渲染方式,还是不得不把数据给抽取出来放到单独的内存区中。我尝试过STL容器,发现处理速度真的不尽人意,明显的迟缓,实在多此一举。调试了一个下午还是全部用memcpy搞定了一切。单个模型,所有的顶点数据、纹理坐标、索引都与单个Obj独立开来,形成了一个整体,这样渲染效率高。不过发现这个向量是个巨大的问题。3DS格式没有保存坐标数据,而用lib3ds的计算函数计算得到的向量又是不好使用的 —— 它为每个面都计算了3个向量,导致了一个定点就会有3个向量,可是这可能么?!我回去再去看看。
很想写一个类似于NVIDIA SDK中的图形基础库放到sf.net上,处理纹理,模型等等。
发现了一个搞笑的BUG,来自NVIDIA SDK 9.5,如果大伙不相信可是试试。NVIDIA SDK 9.5提供了许多库,其中有一个叫做NV_DDS,源文件有使用方法,就是提供一个和DIRECTX无关的DDS纹理读取处理支持。同样的,NVIDIA还有一个Adobe Photoshop CS2的DDS插件,用来导出DDS格式的纹理。搞笑的是,用NV_DDS库读取一个2D with Mipmap的DDS文件竟然发现无法识别,调试的时候发现给识别成了CubeMap!?我回学校后再来调试调试,对比一下DirectX SDK自带的纹理处理工具以及NV提供的命令行工具,看看究竟是不是真的出错。
买了笔记本电脑感觉也没有那么好,反而觉得更忙,天天有看不完的PDF,调试不完的代码。
昨天又跑了一趟女生宿舍帮她们弄路由器,好说待说的让我进去了。上楼道的时候引来一阵阵诧异。回来的时候舍友说,“我们天天就生活在你的光环下了,你现在人气实在太高了,反正你也没有女朋友,就先干脆整一个吧”。我无语,实在是无语。
刚刚星期天学了一套恰恰恰铜牌舞步,很简单的那种,不过踩了女舞伴一下嘿嘿。还是那句话,脚下基本功要扎实。虽然说自负的我很少夸奖别人,不过这次是真的,赵老师真不错!