|
- // CreateTexture()方式
- // 若显卡不支持非2的次幂,则创建非2的次幂尺寸图像将失败
- hr = m_pD3DDevice->CreateTexture(300, 300, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture, NULL);
- // D3DXCreateTexture()方式
- // 若显卡不支持非2的次幂,则创建非2的次幂图像将被扩充成2的次幂
- hr = D3DXCreateTexture(m_pD3DDevice, 300, 300, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture);
- // D3DXCreateTextureFromFileEx()方式
- // 若显卡不支持非2的次幂,则创建非2的次幂图像不会失败,且不会被扩充成2的次幂
- hr = D3DXCreateTextureFromFileEx(m_pD3DDevice, szFile, D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2,
- D3DFMT_FROM_FILE, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
- D3DX_DEFAULT, 0, &imageInfo, NULL, &m_pTexture);
- // D3DXCreateTextureFromFileInMemoryEx()方式
- // 若显卡不支持非2的次幂,则创建非2的次幂图像将会无视D3DX_DEFAULT_NONPOW2,进而将图像尺寸扩充成2的次幂
- FILE* pFile = fopen(szFile, "rb");
- fseek(pFile, 0, SEEK_END);
- int size = ftell(pFile);
- fseek(pFile, 0, SEEK_SET);
- BYTE* pData = new BYTE[size];
- fread(pData, size, 1, pFile);
- fclose(pFile);
- hr = D3DXCreateTextureFromFileInMemoryEx(m_pD3DDevice, pData, size, D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_DEFAULT,
- 0, &imageInfo, NULL, &m_pTexture);
复制代码
很奇怪的是,通过D3DXCreateTextureFromFileEx()创建的纹理即使显卡不支持非2的次幂,也能创建成功,并且通过GetLevelDesc()函数获得的尺寸仍然是原尺寸,且通过LockRect()得到的pitch也是非2的次幂,而D3DXCreateTextureFromFileInMemoryEx()却不行,非常奇怪.
我在想,既然D3DXCreateTextureFromFileEx()可以实现非2的次幂图像的顺利加载,为什么其他函数却不可以,特别是D3DXCreateTexture()和CreateTexture(),而恰恰是通过填充像素来创建纹理的方式更频繁些.很可能D3D这些方式也都可以实现,就是我还没找到那个方法..
D3D这水真是深.. |
|