2013-04-23 74 views

回答

3

首先你必須加載原始位圖數據。有很多種方法:

  • 寫自己的裝載機(未在21世紀OO)
  • 使用庫您需要的格式。如libpng,libjpeg,google上更多=)
  • 使用多格式庫(C/C++ Image Loading)。 FreeImage是我的最愛。

然後,你必須創建通過D3DXCreateTextureFromFileInMemoryD3DXCreateTextureFromFileInMemoryExIDirect3DTexture9,你準備去=)

更新:

好。我們不能使用它D3DXCreateTextureFromFileInMemory。所以......我們可以實施它。 如前所述,我們必須以某種方式將位圖加載到內存中(我更喜歡使用FreeImage)。然後我們創建IDirect3DTexture9*通過CreateTexture()方法。然後,我們使用LockRect()/UnlockRect()將位圖的內容複製到該紋理。那次我們準備好了,因爲我已經測試過了! =)測試VS2012解決方案,包括用於FreeType:link(髒亂,改寫它,請在一類包裝) 核心功能:

void CreateTexture(const wchar_t* filename) 
{ 
unsigned int width(0), height(0); 
std::vector<unsigned char> bitmap; 
LoadBitmapFile(filename, bitmap, width, height); // Wrapped FreeImage 

// Create empty IDirect3DTexture9* 
pDevice->CreateTexture(width, height, 1, 0, 
          D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, 0); 
if (!pTexture) 
{ 
    throw std::runtime_error("CreateTexture failed"); 
} 

D3DLOCKED_RECT rect; 
pTexture->LockRect(0, &rect, 0, D3DLOCK_DISCARD); 
unsigned char* dest = static_cast<unsigned char*>(rect.pBits); 
memcpy(dest, &bitmap[0], sizeof(unsigned char) * width * height * 4); 
pTexture->UnlockRect(0); 

}

希望它能幫助。

P.S.其實還有另一個問題:投影矩陣。您將需要手動創建它或使用一些數學庫,因爲您無法使用D3DXMatrix ..()函數。

+0

D3DXCreateTextureFromFileInMemory在'd3dx9.lib',我不能使用它 – hoody 2013-04-24 06:07:49

+0

那麼,我的回答是完全錯誤的,對不起。 – Drop 2013-04-24 06:45:38

+1

我已經更新了我的答案:我們可以在沒有D3DXCreateTextureFromFileInMemory的情況下創建紋理資源。 – Drop 2013-04-24 11:58:23

相關問題