Format Piksel dan Mode Alfa yang Didukung

Topik ini menjelaskan format piksel dan mode alfa yang didukung oleh berbagai bagian Direct2D, termasuk setiap jenis target render, ID2D1Bitmap, dan ID2D1ImageSource. Ini berisi bagian berikut.

Format YUV yang Didukung untuk Sumber Gambar DXGI

ID2D1ImageSource adalah penyedia piksel abstrak. Ini dapat dibuat dari WIC (CreateImageSourceFromWic atau IDXGISurface (CreateImageSourceFromDxgi).

ID2D1ImageSourceFromWic mendukung set format piksel dan mode alfa yang sama dengan ID2D1Bitmap.

Selain hal di atas, ID2D1ImageSource yang dibuat dari IDXGISurface juga mendukung beberapa format piksel YUV, termasuk data planar yang dibagi menjadi beberapa permukaan. Lihat CreateImageSourceFromDxgi untuk informasi selengkapnya tentang persyaratan untuk setiap format piksel.

Format
DXGI_FORMAT_AYUV
DXGI_FORMAT_NV12
DXGI_FORMAT_YUY2
DXGI_FORMAT_P208
DXGI_FORMAT_V208
DXGI_FORMAT_V408
DXGI_FORMAT_R8_UNORM
DXGI_FORMAT_R8G8_UNORM

 

Menentukan Format Piksel untuk Target Render

Saat membuat target render, Anda harus menentukan format pikselnya. Untuk menentukan format piksel, Anda menggunakan struktur D2D1_PIXEL_FORMAT untuk mengatur anggota pixelFormat dari struktur D2D1_RENDER_TARGET_PROPERTIES . Kemudian, Anda meneruskan struktur tersebut ke metode Buat yang sesuai, seperti ID2D1Factory::CreateHwndRenderTarget.

Struktur D2D1_PIXEL_FORMAT memiliki dua bidang:

  • format, nilai DXGI_FORMAT yang menjelaskan ukuran dan susunan saluran di setiap piksel, dan
  • alpha, nilai D2D1_ALPHA_MODE yang menjelaskan bagaimana informasi alfa ditafsirkan.

Contoh berikut membuat struktur D2D1_PIXEL_FORMAT dan menggunakannya untuk menentukan format piksel dan mode alfa ID2D1HwndRenderTarget.

RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a pixel format and initial its format
// and alphaMode fields.
D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
    DXGI_FORMAT_B8G8R8A8_UNORM,
    D2D1_ALPHA_MODE_IGNORE
    );

D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();
props.pixelFormat = pixelFormat;

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    props,
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRT
    );

Target render yang berbeda mendukung kombinasi format dan mode alfa yang berbeda. Bagian berikut mencantumkan kombinasi format dan alfa yang didukung oleh setiap target render.

Format yang Didukung untuk ID2D1HwndRenderTarget

Format yang didukung untuk ID2D1HwndRenderTarget bergantung pada apakah format tersebut dirender dengan menggunakan perangkat keras atau perangkat lunak, atau apakah Direct2D menangani mode penyajian secara otomatis secara default.

Catatan

Kami menyarankan agar Anda menggunakan DXGI_FORMAT_B8G8R8A8_UNORM sebagai format piksel untuk performa yang lebih baik. Ini sangat membantu untuk target render perangkat lunak. Target format BGRA berkinerja lebih baik daripada format RGBA.

 

Saat membuat ID2D1HwndRenderTarget, Anda menggunakan struktur D2D1_RENDER_TARGET_PROPERTIES untuk menentukan opsi penyajian. Opsi ini menyertakan format piksel, seperti yang disebutkan di bagian sebelumnya. Bidang jenis struktur ini memungkinkan Anda menentukan apakah target render dirender ke perangkat keras atau perangkat lunak, atau apakah Direct2D harus secara otomatis menentukan mode penyajian.

Untuk mengaktifkan Direct2D untuk menentukan apakah target render menggunakan penyajian perangkat keras atau perangkat lunak, gunakan pengaturan D2D1_RENDER_TARGET_TYPE_DEFAULT .

Tabel berikut mencantumkan format yang didukung untuk objek ID2D1HwndRenderTarget yang dibuat dengan menggunakan pengaturan D2D1_RENDER_TARGET_TYPE_DEFAULT .

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Untuk memaksa target render menggunakan penyajian perangkat keras, gunakan pengaturan D2D1_RENDER_TARGET_TYPE_HARDWARE . Tabel berikut mencantumkan format yang didukung untuk objek ID2D1HwndRenderTarget yang secara eksplisit menggunakan penyajian perangkat keras.

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Untuk memaksa target render menggunakan penyajian perangkat lunak, gunakan pengaturan D2D1_RENDER_TARGET_TYPE_SOFTWARE . Tabel berikut mencantumkan format yang didukung untuk objek ID2D1HwndRenderTarget yang secara eksplisit menggunakan penyajian perangkat lunak.

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Terlepas dari apakah ID2D1HwndRenderTarget dipercepat perangkat keras, format DXGI_FORMAT_UNKNOWN menggunakan DXGI_FORMAT_B8G8R8A8 secara default dan mode alfa D2D1_ALPHA_MODE_UNKNOWN menggunakan D2D1_ALPHA_MODE_IGNORE secara default.

Format yang didukung untuk ID2D1DeviceContext

Dimulai dengan Windows 8 konteks perangkat memanfaatkan lebih banyak format warna tinggi Direct3D seperti:

  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_R16G16B16A16_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R32G32B32A32_FLOAT

Gunakan metode ID2D1DeviceContext::IsDxgiFormatSupported untuk melihat apakah format berfungsi pada konteks perangkat tertentu. Format ini juga dapat berfungsi pada ID2D1HwndRenderTarget.

Format ini selain format yang didukung oleh antarmuka ID2D1HwndRenderTarget di Windows 7. Lihat Konteks Perangkat dan Perangkat untuk informasi selengkapnya.

Format yang Didukung untuk Target Render yang Kompatibel

Target render yang kompatibel (metode ID2D1BitmapRenderTarget yang dibuat oleh salah satu metode ID2D1RenderTarget::CreateCompatibleRenderTarget ) mewarisi format dan mode alfa yang didukung dari target render yang membuatnya. Target render yang kompatibel juga mendukung format dan kombinasi mode alfa berikut, terlepas dari apa yang didukung induknya.

Format Mode alfa
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Format DXGI_FORMAT_UNKNOWN menggunakan format target render induk secara default dan mode alfa D2D1_ALPHA_MODE_UNKNOWN menggunakan D2D1_ALPHA_MODE_PREMULTIPLIED secara default.

Format yang Didukung untuk Target Render Permukaan DXGI

Target render DXGI adalah ID2D1RenderTarget yang dibuat oleh salah satu metode ID2D1Factory::CreateDxgiSurfaceRenderTarget . Ini mendukung format berikut dan kombinasi mode alfa.

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE

 

Catatan

Format harus cocok dengan format permukaan DXGI yang digambar target render permukaan DXGI.

 

Format DXGI_FORMAT_UNKNOWN menggunakan format permukaan DXGI secara default. Jangan gunakan mode alfa D2D1_ALPHA_MODE_UNKNOWN dengan target render permukaan DXGI. Ini tidak memiliki nilai default dan akan menyebabkan pembuatan target render permukaan DXGI gagal.

Format yang Didukung untuk Target Render Bitmap WIC

Target render bitmap WIC adalah ID2D1RenderTarget yang dibuat oleh salah satu metode ID2D1Factory::CreateWicBitmapRenderTarget . Ini mendukung format berikut dan kombinasi mode alfa.

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN

 

Format piksel target bitmap WIC harus sesuai dengan format piksel bitmap WIC.

FormatDXGI_FORMAT_UNKNOWN menggunakan format bitmap WIC secara default dan mode alfa D2D1_ALPHA_MODE_UNKNOWN menggunakan mode alfa bitmap WIC secara default.

Format yang Didukung untuk ID2D1DCRenderTarget

ID2D1DCRenderTarget mendukung kombinasi format dan mode alfa berikut.

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE

 

Jangan gunakan format DXGI_FORMAT_UNKNOWN atau mode alfa D2D1_ALPHA_MODE_UNKNOWN dengan ID2D1DCRenderTarget. Ini tidak memiliki nilai default dan akan menyebabkan pembuatan ID2D1DCRenderTarget gagal.

Menentukan Format Piksel untuk ID2D1Bitmap

Umumnya, objek ID2D1Bitmap mendukung format dan mode alfa berikut (dengan beberapa batasan, dijelaskan dalam paragraf berikut.)

Format Mode alfa
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT
DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_UNKNOWN D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_B8G8R8X8_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC1_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC1_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC2_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC2_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC2_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_UNKNOWN
DXGI_FORMAT_BC3_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_PREMULTIPLIED
DXGI_FORMAT_BC3_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_IGNORE
DXGI_FORMAT_BC3_UNORM (hanya Windows 8.1 dan yang lebih baru) D2D1_ALPHA_MODE_UNKNOWN

 

Saat Anda menggunakan metode ID2D1RenderTarget::CreateSharedBitmap , Anda menggunakan bidang pixelFormat dari struktur D2D1_BITMAP_PROPERTIES untuk menentukan format piksel target render baru. Ini harus cocok dengan format piksel sumber ID2D1Bitmap .

Saat Anda menggunakan metode CreateBitmapFromWicBitmap , Anda menggunakan bidang pixelFormat dari struktur D2D1_BITMAP_PROPERTIES (bukan anggota pixelFormat dari struktur D2D1_RENDER_TARGET_PROPERTIES ) untuk menentukan format piksel target render baru. Ini harus cocok dengan format piksel sumber bitmap WIC.

Catatan

Untuk informasi selengkapnya tentang dukungan untuk format piksel blok terkompresi (BCn), lihat Kompresi blok.

 

Format WIC yang Didukung

Saat Anda menggunakan metode CreateBitmapFromWicBitmap untuk membuat bitmap dari bitmap WIC, atau ketika Anda menggunakan metode CreateSharedBitmap dengan IWICBitmapLock, sumber WIC harus dalam format yang didukung oleh Direct2D.

Format WIC Format DXGI terkait Mode alfa yang sesuai
GUID_WICPixelFormat8bppAlpha DXGI_FORMAT_A8_UNORM D2D1_ALPHA_MODE_STRAIGHT atau D2D1_ALPHA_MODE_PREMULTIPLIED
GUID_WICPixelFormat32bppPRGBA DXGI_FORMAT_R8G8B8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED atau D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppBGR DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_IGNORE
GUID_WICPixelFormat32bppPBGRA DXGI_FORMAT_B8G8R8A8_UNORM D2D1_ALPHA_MODE_PREMULTIPLIED

 

Untuk contoh yang memperlihatkan cara mengonversi bitmap WIC ke format yang didukung, lihat Cara Memuat Bitmap dari File.

Menggunakan Format yang Tidak Didukung

Menggunakan kombinasi apa pun selain format piksel dan mode alfa yang tercantum dalam tabel sebelumnya menghasilkan D2DERR_UNSUPPORTED_PIXEL_FORMAT atau kesalahan E_INVALIDARG .

Tentang Mode Alfa

Tentang Mode Premultiplied dan Straight Alpha

Enumerasi D2D1_ALPHA_MODE menunjukkan apakah saluran alfa menggunakan alfa yang telah diisi sebelumnya, alfa lurus, atau harus diabaikan dan dianggap buram. Dengan alfa lurus, saluran alfa menunjukkan nilai yang sesuai dengan seberapa transparan warnanya.

Warna selalu diperlakukan sebagai alfa lurus oleh perintah gambar Direct2D dan kuas, terlepas dari format tujuannya.

Dengan alfa yang telah ditentukan sebelumnya, setiap saluran warna diskalakan oleh nilai alfa. Biasanya, tidak ada nilai saluran warna yang lebih besar dari nilai saluran alfa. Jika nilai saluran warna dalam format yang telah dikalikan sebelumnya lebih besar dari saluran alfa, matematika perpaduan source-over standar akan membuat campuran aditif.

Nilai saluran alfa itu sendiri sama dalam alfa lurus dan dikalikan sebelumnya.

Perbedaan Antara Alfa Lurus dan Premultiplied

Saat menjelaskan warna RGBA dengan menggunakan alfa lurus, nilai alfa warna disimpan di saluran alfa. Misalnya, untuk menjelaskan warna merah yang buram 60%, gunakan nilai berikut: (255, 0, 0, 255 * 0,6) = (255, 0, 0, 153). Nilai 255 menunjukkan merah penuh, dan 153 (yaitu 60 persen dari 255) menunjukkan bahwa warna harus memiliki opasitas 60 persen.

Saat menjelaskan warna RGBA dengan menggunakan alfa yang telah diisi sebelumnya, setiap warna dikalikan dengan nilai alfa: (255 * 0,6, 0 * 0,6, 0 * 0,6, 255 * 0,6) = (153, 0, 0, 153).

Terlepas dari mode alfa target render, nilai D2D1_COLOR_F selalu ditafsirkan sebagai alfa lurus. Misalnya, saat menentukan warna ID2D1SolidColorBrush untuk digunakan dengan target render yang menggunakan mode alfa yang telah ditentukan sebelumnya, tentukan warna seperti yang Anda lakukan jika target render menggunakan alfa lurus. Saat Anda melukis dengan kuas, Direct2D menerjemahkan warna ke format tujuan untuk Anda.

Mode Alfa untuk Target Render

Terlepas dari pengaturan mode alfa, konten target render mendukung transparansi. Misalnya, jika Anda menggambar persegi panjang merah yang sebagian transparan dengan target render dengan mode alfa D2D1_ALPHA_MODE_IGNORE, persegi panjang akan tampak merah muda (jika latar belakang berwarna putih).

Jika Anda menggambar persegi panjang merah yang sebagian transparan saat mode alfa D2D1_ALPHA_MODE_PREMULTIPLIED, persegi panjang akan tampak merah muda (dengan asumsi latar belakang putih) dan Anda dapat melihatnya ke apa pun yang ada di belakang target render. Ini berguna saat Anda menggunakan ID2D1DCRenderTarget untuk merender ke jendela transparan atau saat Anda menggunakan target render yang kompatibel (render yang ditargetkan dibuat oleh metode CreateCompatibleRenderTarget ) untuk membuat bitmap yang mendukung transparansi.

Mode ClearType dan Alpha

Jika Anda menentukan mode alfa selain D2D1_ALPHA_MODE_IGNORE untuk target render, mode antialias teks secara otomatis berubah dari D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE ke D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE. (Saat Anda menentukan mode alfa D2D1_ALPHA_MODE_UNKNOWN, Direct2D mengatur alfa untuk Anda, tergantung pada jenis target render.)

Anda dapat menggunakan metode SetTextAntialiasMode untuk mengubah mode antialias teks kembali ke D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE, tetapi merender teks ClearType ke permukaan transparan dapat membuat hasil yang tidak dapat diprediksi. Jika Anda ingin merender teks ClearType ke target render transparan, kami sarankan Anda menggunakan salah satu dari dua teknik berikut.

  • Gunakan metode PushAxisAlignedClip untuk mengklip target render ke area tempat teks akan dirender, lalu panggil metode Clear dan tentukan warna buram, lalu render teks Anda.
  • Gunakan DrawRectangle untuk menggambar persegi panjang buram di belakang area tempat teks akan dirender.

D2D1_PIXEL_FORMAT

D2D1_ALPHA_MODE

DXGI_FORMAT