Bagikan melalui


Pengaruh presisi dan pengetatan

Perhatian harus diberikan saat merender efek menggunakan Win2D untuk mencapai tingkat kualitas dan prediktabilitas yang diinginkan terkait presisi numerik.

Anda perlu memahami detail ini jika:

  1. Grafik efek Anda bergantung pada presisi atau warna numerik tinggi di luar rentang [0, 1], dan Anda ingin memastikan ini akan selalu tersedia.
  2. Atau grafik efek Anda bergantung pada implementasi penyajian untuk menjepit warna menengah ke rentang [0, 1], jadi Anda harus memastikan penjepitan ini selalu terjadi.

Win2D sering membagi grafik efek menjadi beberapa bagian, dan merender setiap bagian dalam langkah terpisah. Output dari beberapa langkah dapat disimpan dalam tekstur Direct3D menengah yang secara default memiliki rentang numerik dan presisi terbatas. Win2D tidak menjamin tentang apakah atau di mana tekstur menengah ini digunakan. Perilaku ini dapat bervariasi sesuai dengan kemampuan GPU serta antara versi Windows.

Di Windows 10, Win2D menggunakan lebih sedikit tekstur menengah karena penggunaan penautan shader . Oleh karena itu, Win2D dapat menghasilkan hasil yang berbeda dengan pengaturan default daripada rilis Windows sebelumnya. Ini terutama mempengaruhi skenario di mana penautan shader dimungkinkan dalam grafik efek, dan grafik tersebut juga berisi efek yang menghasilkan warna output rentang yang diperluas.

Gambaran umum penyajian efek dan perantara

Untuk merender grafik efek, Win2D pertama-tama menemukan grafik "transformasi" yang mendasar, di mana transformasi adalah simpul grafik yang digunakan dalam efek untuk menerapkan operasi pemrosesan tertentu. Setiap efek gambar dapat diimplementasikan secara internal menggunakan satu atau beberapa transformasi. Ada berbagai jenis transformasi, termasuk yang menyediakan shader Direct3D untuk digunakan Direct2D.

Misalnya, Win2D dapat merender grafik efek sebagai berikut:

diagram alur yang menunjukkan pipeline D2D menggunakan tekstur perantara di setiap langkah

Win2D mencari peluang untuk menghindari penggunaan tekstur menengah. Logika ini buram untuk aplikasi, dan dapat mengurangi jumlah tekstur menengah yang digunakan. Misalnya, grafik berikut dapat dirender oleh Win2D menggunakan satu panggilan gambar Direct3D dan tanpa tekstur perantara:

diagram alir yang menggambarkan rangkaian efek D2D yang saling terhubung

Sebelum Windows 10, Win2D akan selalu menggunakan tekstur menengah jika beberapa pemisah piksel digunakan dalam grafik efek yang sama. Sebagian besar efek bawaan yang hanya menyesuaikan nilai warna (misalnya, Kecerahan atau Saturasi) melakukannya menggunakan pemecah piksel.

Di Windows 10, Win2D sekarang dapat menghindari penggunaan tekstur menengah dalam kasus seperti itu. Ini dilakukan dengan menautkan shader piksel yang berdekatan secara internal. Contohnya:

bagan alur yang memperlihatkan contoh lain dari dua efek D2D, menggunakan shader piksel dalam kasus ini, digabungkan

Perhatikan bahwa tidak semua shader piksel yang berdekatan dalam grafik dapat ditautkan bersama-sama, dan oleh karena itu hanya grafik tertentu yang akan menghasilkan output yang berbeda pada Windows 10. Untuk detail selengkapnya, lihat Penautan Shader Efek . Pembatasan utama adalah:

  • Efek tidak akan ditautkan dengan efek yang mengkonsumsi outputnya, jika efek pertama terhubung sebagai input ke beberapa efek.
  • Efek tidak akan terhubung dengan set efek yang menjadi inputnya, jika efek pertama menyampel inputnya pada posisi logis yang berbeda dari outputnya. Misalnya, efek ColorMatrix mungkin akan ditautkan dengan inputnya, tetapi efek Convolution tidak demikian.

Perilaku efek bawaan

Banyak efek bawaan dapat menghasilkan warna di luar rentang [0, 1] dalam ruang yang tidak dipremultipleks, bahkan ketika warna input berada dalam rentang tersebut. Ketika ini terjadi, warna tersebut mungkin dikenakan batasan numerik. Perhatikan bahwa penting untuk mempertimbangkan rentang warna dalam ruang yang tidak dipremultipleks, meskipun efek bawaan biasanya menghasilkan warna dalam ruang yang dipremultipleks. Ini memastikan bahwa warna tetap dalam rentang, bahkan jika efek lain kemudian menghilangkan premultiplikasi dari warna tersebut.

Beberapa efek yang memancarkan warna di luar rentang normal ini menawarkan properti ClampOutput. Ini termasuk:

  • ColorMatrix
  • ArithmeticComposite
  • Convolve
  • efek Transfer

ClampOutput Mengatur properti ke true pada efek ini memastikan hasil yang konsisten akan dicapai terlepas dari faktor-faktor seperti penautan shader. Perhatikan bahwa penjepitan terjadi di ruang yang belum dipremultipleks.

Efek bawaan lainnya juga dapat menghasilkan warna output di luar rentang [0, 1] dalam ruang yang tidak terpremultiplikasi, bahkan ketika piksel warnanya (dan `properti warna` jika ada) berada dalam rentang tersebut. Ini termasuk:

  • efek Transform dan Scale (ketika properti InterpolationMode adalah Cubic atau HighQualityCubic)
  • Efek pencahayaan
  • EdgeDetection (saat properti OverlayEdges adalah true)
  • Exposure
  • Composite (saat properti Mode adalah Add)
  • Saturation
  • Sepia
  • TemperatureAndTint

Memaksa penjepitan numerik dalam grafik efek

Saat menggunakan efek yang tercantum di atas yang tidak memiliki properti ClampOutput, aplikasi harus mempertimbangkan untuk memaksa penjepitan numerik. Ini dapat dilakukan dengan memasukkan efek tambahan ke dalam grafik yang menjepit pikselnya. Efek ColorMatrix dapat digunakan, dengan pengaturan propertinya ClampOutput ke true.

Opsi kedua untuk mencapai hasil yang konsisten adalah meminta win2D menggunakan tekstur menengah yang memiliki presisi lebih besar. Ini dijelaskan di bawah ini.

Mengontrol presisi tekstur perantara

Win2D menyediakan beberapa cara untuk mengontrol presisi grafik.

Sebelum menggunakan format presisi tinggi di Win2D, aplikasi harus memastikan mereka didukung dengan cukup oleh GPU. Untuk memeriksa ini, gunakan IsBufferPrecisionSupported(CanvasBufferPrecision).

Aplikasi dapat membuat perangkat Direct3D menggunakan WARP (emulasi perangkat lunak) untuk memastikan bahwa semua presisi buffer didukung. Ini direkomendasikan dalam skenario seperti menerapkan efek pada foto saat menyimpan ke disk. Bahkan jika Win2D mendukung format buffer dengan presisi yang tinggi pada GPU, menggunakan WARP direkomendasikan dalam skenario ini pada GPU dengan tingkat fitur 9.X, karena presisi yang terbatas pada aritmatika shader dan sampling pada beberapa GPU seluler berdaya rendah. Untuk menggunakan rendering perangkat lunak, tentukan ForceSoftwareRenderer = true pada kontrol Win2D XAML Anda atau saat membuat CanvasDevice.

Dalam setiap kasus di bawah ini, presisi yang diminta sebenarnya adalah presisi minimum yang akan digunakan Win2D. Presisi yang lebih tinggi dapat digunakan jika perantara tidak diperlukan. Win2D juga dapat berbagi tekstur menengah untuk berbagai bagian dari grafik yang sama atau grafik yang berbeda sepenuhnya. Dalam hal ini Win2D menggunakan presisi maksimum yang diminta untuk semua operasi yang terlibat.

Pemilihan presisi dari sesi menggambar

Cara paling sederhana untuk mengontrol presisi tekstur perantara Win2D adalah dengan menggunakan EffectBufferPrecision properti . Ini mengontrol presisi dari semua tekstur perantara, sejauh presisi tersebut tidak diatur secara manual langsung pada efek.

if (canvasDevice.IsBufferPrecisionSupported(CanvasBufferPrecision.Precision32Float))
{
    drawingSession.EffectBufferPrecision = CanvasBufferPrecision.Precision32Float;
}

Pemilihan presisi dari input dan target render

Aplikasi juga dapat mengandalkan presisi input ke grafik efek untuk mengontrol presisi tekstur menengah.

Presisi input ke efek disalurkan melalui grafik untuk menentukan presisi perantara di bagian hilir. Pada titik pertemuan cabang-cabang berbeda dalam grafik efek, tingkat presisi tertinggi dari semua input yang tersedia akan digunakan.

Presisi yang dipilih berdasarkan bitmap Win2D ditentukan dari format pikselnya.

Ada kemungkinan bahwa Win2D tidak dapat menetapkan efek presisi berdasarkan inputnya. Ini terjadi ketika efek tidak memiliki input, atau ketika daftar perintah digunakan, yang tidak memiliki presisi khusus. Dalam hal ini, presisi tekstur menengah ditentukan dari target render saat ini.

Pemilihan presisi langsung pada efek

Presisi minimum untuk tekstur menengah juga dapat diatur di lokasi eksplisit dalam grafik efek. Ini hanya direkomendasikan untuk aplikasi tingkat lanjut.

Presisi minimum dapat diatur menggunakan properti pada efek sebagai berikut:

if (canvasDevice.IsBufferPrecisionSupported(CanvasBufferPrecision.Precision32Float))
{
    blurEffect.BufferPrecision = CanvasBufferPrecision.Precision32Float;
}

Perhatikan bahwa presisi yang ditetapkan pada efek juga akan berlaku untuk efek hilir dalam grafik efek yang sama, kecuali presisi yang berbeda diatur pada efek hilir tersebut.

Di bawah ini adalah logika rekursif lengkap yang digunakan untuk menentukan presisi minimum untuk buffer perantara yang menyimpan output simpul transformasi tertentu:

bagan alur yang mengilustrasikan bagaimana Win2D memutuskan presisi mana yang akan digunakan untuk buffer perantara dalam grafik penyajian