使用壓縮紋理 (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。 此函式負責處理壓縮與解壓縮表面之間的轉換。
相關主題