我的观点基于以下几点:
若显卡不支持非2的次幂纹理,则:
1:若使用IDirect3DDevice9::CreateTexture创建非2的次幂尺寸图像将失败
2:若使用D3DXCreateTexture创建非2的次幂图像将被扩充成2的次幂
3:若使用D3DXCreateTextureFromFileInMemoryEx创建非2的次幂图像将被扩充成2的次幂(就算用了D3DX_DEFAULT_NONPOW2也没用)
只有一个函数比较特殊:D3DXCreateTextureFromFileEx,用它创建图像可以完美支持非2的次幂图像,但实际游戏中很少用这个函数,故总体上,创建一个非2的次幂纹理,还是显卡说了算,我没找到除了D3DXCreateTextureFromFileEx之外,D3D会帮你做兼容的函数。
对于2D游戏来讲,将纹理扩充成2的次幂将是一个致命打击,特别是对于使用商业资源进行做游戏的人来讲尤其如此。
难怪windows游戏编程大师技巧的作者也认为,用D3D做2D很麻烦。
我想,有用D3D做过2D游戏的朋友,应该会有同感。
求高手指正缺漏。
mark一下,同求高手 为什么说实际游戏中很少用D3DXCreateTextureFromFileEx呢?这函数有问题?
专业一点的游戏,没有人不去做资源封包处理。 哦!明白~~~~~~ D3DXCreateTextureFromFileEx 会和DX版本有不同
一般都用Device::CreateTexture来处理 = =除了D3D之外,OPENGL更麻烦,只支持三种尺寸的纹理。(我什么都不知道,求高人指教) 看来,DX9就是直接把内存也给显卡化了,或3D化了,就是说他不像ddraw一样可以自由定义表面的大小,而是在内存中就直接强制以2的次幂进行存储,统一将游戏开发3D化,其实这也很好理解,毕竟DX8以后就全是为3D服务了,而3D游戏就是靠显卡。
以下是在我笔记本(不支持非2的次幂图片)上的测试情况:
创建100张32位600×600的tga图片(总量为137M)的比较:
1:[DX9]D3DXCreateTextureFromFileInMemoryEx()
占用内存:550M
2:[DX9]D3DXCreateTexture()
占用内存:556M
3:[DX9]D3DXCreateTextureFromFileEx()
占用内存:149M
4:[DDraw]IDirectDrawSurface7::CreateSurface()
占用内存:145M 5:[DX9]IDirect3DDevice9::CreateTexture()
创建失败,必须手动将参数调整为2的次幂才行