使用 Direct3D 9 (壓縮紋理)
判斷壓縮紋理的支援
若要測試配接器,請指定任何使用 DXT1、DXT2、DXT3、DXT4 或 DXT5 的像素格式。 如果 IDirect3D9::CheckDeviceFormat 傳回D3D_OK,裝置可以直接從使用該格式的壓縮紋理表面建立紋理。 如果是,您可以藉由呼叫 IDirect3DDDevice9::SetTexture 方法,直接搭配 Direct3D 使用壓縮紋理表面。 下列程式碼範例示範如何判斷配接器是否支援壓縮紋理格式。
BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat,
D3DFORMAT AdapterFormat )
{
HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
0,
D3DRTYPE_TEXTURE,
TextureFormat);
return SUCCEEDED( hr );
}
如果裝置不支援壓縮紋理表面的文字,您仍然可以將紋理資料儲存在壓縮格式介面中,但您必須將任何壓縮的紋理轉換成支援的格式,才能用於文字。
建立壓縮紋理
在配接器上建立支援壓縮紋理格式的裝置之後,您可以建立壓縮的紋理資源。 呼叫 IDirect3DDevice9::CreateTexture ,並指定 Format 參數的壓縮紋理格式。
將影像載入紋理物件之前,請先呼叫 IDirect3DTexture9::GetSurfaceLevel 方法來擷取紋理表面的指標。
現在您可以使用任何 D3DXLoadSurfacexxx 函式,將影像載入至使用 IDirect3DTexture9::GetSurfaceLevel擷取的介面。 這些函式會處理與壓縮紋理格式之間的轉換。
您可以使用 DirectX 紋理編輯器 (Dxtex.exe) 隨附的 DirectX 紋理編輯器 (Dxtex.exe 來建立和轉換壓縮紋理 (DDS) 檔案。 您可以從 DirectX SDK 取得Dxtex.exe並瞭解它。 如需 DirectX SDK 的相關資訊,請參閱 DirectX SDK 在哪裡?。
此行為的優點是應用程式可以將壓縮表面的內容複寫到檔案,而不需要計算特定寬度和高度特定格式表面所需的儲存空間量。
下表顯示五種類型的壓縮紋理。 如需如何儲存資料的詳細資訊,請參閱 壓縮紋理格式 (Direct3D 9) 。 只有在撰寫自己的壓縮常式時,才需要此資訊。
FOURCC | Description | Alpha 預乘? |
---|---|---|
DXT1 | 不透明/1 位 Alpha | N/A |
DXT2 | 明確 Alpha | Yes |
DXT3 | 明確 Alpha | No |
DXT4 | 插入 Alpha | Yes |
DXT5 | 插入 Alpha | No |
當您將資料從非多乘格式傳輸到預乘格式時,Direct3D 會根據 Alpha 值調整色彩。 不支援將資料從預乘格式傳輸至非取代格式。 如果您嘗試將資料從預乘 Alpha 來源傳輸到非premultiplied Alpha 目的地,此方法會傳回D3DERR_INVALIDCALL。 如果您將資料從預乘 Alpha 來源傳輸到沒有 Alpha 的目的地,則會依原樣複製已縮放的來源色彩元件。
解壓縮壓縮紋理表面
如同壓縮紋理表面,解壓縮壓縮紋理是透過 Direct3D 複製服務來執行。
若要將壓縮紋理表面複製到未壓縮的紋理表面,請使用 D3DXLoadSurfaceFromSurface函數。 此函式會處理壓縮和未壓縮表面的壓縮。
相關主題