使用 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函數。 此函式會處理壓縮和未壓縮表面的壓縮。

壓縮紋理資源