Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Grafik efek Anda bergantung pada presisi atau warna numerik tinggi di luar rentang [0, 1], dan Anda ingin memastikan ini akan selalu tersedia.
- 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:
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:
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:
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 efekConvolution
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
danScale
(ketika propertiInterpolationMode
adalahCubic
atauHighQualityCubic
) - Efek pencahayaan
-
EdgeDetection
(saat propertiOverlayEdges
adalahtrue
) Exposure
-
Composite
(saat propertiMode
adalahAdd
) 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:
Windows developer