共用方式為


使用壓縮紋理 (Direct3D 9)

判斷壓縮紋理的支援

若要測試配接器,請指定任何使用 DXT1、DXT2、DXT3、DXT4 或 DXT5 的像素格式。 如果 IDirect3D9::CheckDeviceFormat 傳回D3D_OK,裝置可以直接從使用該格式的壓縮紋理表面建立紋理。 若是如此,您可以藉由呼叫 IDirect3DDevice9::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 紋理編輯器,建立和轉換壓縮紋理 (DDS) 檔案。 您可以從 DirectX SDK 取得 Dxtex.exe,並了解有關它的資訊。 如需 DirectX SDK 的相關信息,請參閱 DirectX SDK 在哪裡?

此行為的優點是,應用程式可以將壓縮表面的內容複製到檔案,而不需要計算特定寬度和高度表面的特定格式所需的儲存空間量。

下表顯示五種類型的壓縮紋理。 如需資料儲存方式的詳細資訊,請參閱 壓縮紋理格式 (Direct3D 9)。 只有在您撰寫自己的壓縮例程時,才需要此資訊。

FOURCC 描述 Alpha 預乘?
DXT1 不透明/1 位 Alpha N/A
DXT2 明確的阿爾法 是的
DXT3 明確Alpha
DXT4 插值阿爾法 是的
DXT5 插值α

 

當您將數據從非預乘格式傳輸到預乘格式時,Direct3D 會根據 Alpha 值調整色彩。 不支援將數據從預乘格式傳輸至非預乘格式。 如果您嘗試將數據從預乘 Alpha 來源傳輸到非預乘 Alpha 目的地,此方法會傳回D3DERR_INVALIDCALL。 如果您將資料從預乘 Alpha 來源傳輸到沒有 Alpha 的目的地,則已依 Alpha 縮放的來源色彩元件會直接複製過去。

解壓縮壓縮紋理表面

如同壓縮紋理表面一樣,解壓縮已壓縮的紋理是透過 Direct3D 提供的複製功能來執行。

若要將壓縮紋理表面複製到未壓縮的紋理表面,請使用 函式 D3DXLoadSurfaceFromSurface。 此函式負責處理壓縮與解壓縮表面之間的轉換。

壓縮紋理資源