Penautan Efek Shader
Direct2D menggunakan optimisasi yang disebut penyambungan shader efek, yang menggabungkan beberapa kali perenderan grafik efek menjadi satu kali.
- Gambaran Umum Penautan Shader Efek
- Menggunakan Penghubungan Shader Efek
- Menulis efek kustom yang dapat terhubung dengan shader
- Contoh efek shader yang kompatibel dengan penghubungan
- Mengkompilasi shader yang kompatibel dengan penautan
- spesifikasi fungsi Ekspor
- Topik terkait
Gambaran Umum Penautan Shader Efek
Pengoptimalan penautan efek shader didasarkan pada penautan shader HLSL, fitur Direct3D 11.2 yang memungkinkan penghasilan shader piksel dan vertex pada saat runtime dengan menautkan fungsi shader yang telah dikompilasi sebelumnya. Gambar berikut mengilustrasikan konsep penautan shader efek dalam grafik efek. Gambar pertama menunjukkan grafik efek Direct2D yang khas dengan empat transformasi penyajian. Tanpa penautan shader, setiap transformasi mengonsumsi satu pass rendering dan memerlukan permukaan menengah; secara total, grafik ini memerlukan 4 pass dan 3 permukaan menengah.
Gambar kedua menunjukkan grafik efek yang sama di mana setiap transformasi penyajian telah diganti dengan versi fungsi yang dapat ditautkan. Direct2D dapat menautkan seluruh grafik dan menjalankannya dalam satu pass tanpa memerlukan perantara apa pun. Ini dapat memberikan penurunan signifikan dalam waktu eksekusi GPU dan pengurangan konsumsi memori GPU puncak.
Penautan shader efek beroperasi pada transformasi individu dalam efek; ini berarti bahwa bahkan grafik dengan efek tunggal dapat mendapat manfaat dari penautan shader jika efek tersebut memiliki beberapa transformasi yang valid.
Menggunakan Penautan Efek Shader
Jika Anda membangun aplikasi Direct2D yang menggunakan efek, Anda tidak perlu melakukan apa pun untuk memanfaatkan penautan shader efek. Direct2D secara otomatis menganalisis grafik efek untuk menentukan cara paling optimal untuk menautkan setiap transformasi.
Penulis efek bertanggung jawab untuk menerapkan efeknya dengan cara yang mendukung penautan shader efek; untuk informasi selengkapnya, lihat bagian Menulis efek kustom yang kompatibel dengan penautan shader di bawah ini. Semua efek bawaan mendukung penautan shader.
Direct2D hanya akan menautkan transformasi penyajian yang berdekatan dalam situasi di mana itu bermanfaat. Ini memperhitungkan beberapa faktor saat menentukan apakah akan menautkan dua transformasi. Misalnya, penautan shader tidak dilakukan jika salah satu transformasi menggunakan vertex atau shader komputasi, karena hanya shader piksel yang dapat ditautkan. Selain itu, jika efek tidak ditulis agar kompatibel dengan penautan shader, maka transformasi di sekitarnya tidak akan ditautkan dengannya.
Dalam kasus bahwa bahaya penautan seperti itu ada, Direct2D tidak akan menautkan transformasi apa pun yang berdekatan dengan bahaya, tetapi masih akan mencoba menautkan sisa grafik.
Menulis efek kustom yang kompatibel dengan penautan shader
Jika Anda menulis efek Direct2D kustom Anda sendiri, Anda perlu memastikan bahwa transformasinya mendukung penautan shader efek. Ini memerlukan beberapa perubahan kecil dari bagaimana efek kustom sebelumnya diterapkan. Jika transformasi dalam efek kustom Anda tidak mendukung penautan shader, maka Direct2D tidak akan menautkannya dengan transformasi apa pun yang berdekatan dengannya dalam grafik efek.
Sebagai penulis efek kustom, Anda harus mengetahui beberapa konsep dan persyaratan utama:
Tidak ada perubahan pada implementasi antarmuka efek
Anda tidak perlu mengubah kode apa pun yang menerapkan berbagai antarmuka efek seperti ID2D1DrawTransform.
Menyediakan versi fungsi lengkap dan ekspor dari shader
Anda harus menyediakan versi fungsi ekspor dari shader efek Anda yang dapat ditautkan oleh Direct2D. Selain itu, Anda juga harus terus menyediakan shader asli secara penuh; ini karena Direct2D memilih pada runtime versi shader yang tepat tergantung pada apakah pengaitan shader diterapkan pada tautan tertentu di grafik.
Jika transformasi hanya menghasilkan blob shader piksel penuh (melalui ID2D1EffectContext::LoadPixelShader), tidak akan ditautkan ke transformasi yang berdekatan.
Fungsi pembantu
Direct2D menyediakan fungsi bantu HLSL dan makro yang akan secara otomatis menghasilkan versi lengkap dan versi ekspor dari sebuah fungsi shader. Pembantu ini dapat ditemukan di d2d1effecthelpers.hlsli. Selain itu, kompilator HLSL (FXC) memungkinkan Anda memasukkan shader fungsi ekspor ke dalam bidang privat di shader penuh. Dengan cara ini, Anda hanya perlu menulis shader sekali dan meneruskan kedua versi ke Direct2D secara bersamaan. Baik d2d1effecthelpers.hlsli dan pengkompilasi FXC disertakan sebagai bagian dari Windows SDK.
Fungsi pembantu:
- D2DGetInput
- D2DSampleInput
- D2DSampleInputAtOffset
- D2DSampleInputAtPosition
- D2DGetInputCoordinate
- D2DGetScenePosition
- D2D_PS_ENTRY
Anda juga dapat menulis dua versi setiap shader secara manual dan mengkompilasinya dua kali, selama spesifikasi yang dijelaskan di bawah ini dalam spesifikasi fungsi Export terpenuhi.
shader piksel saja
Direct2D tidak mendukung penautan shader komputasi atau vertex. Namun, jika efek Anda menggunakan shader vertikal dan piksel, output dari shader piksel masih dapat ditautkan.
Pengambilan sampel sederhana versus pengambilan sampel kompleks
Penghubungan fungsi shader dilakukan dengan menghubungkan output dari satu pass shader piksel ke input dari pass shader piksel berikutnya. Ini hanya dimungkinkan ketika shader piksel yang mengonsumsi hanya memerlukan satu nilai input untuk melakukan komputasinya; nilai ini biasanya berasal dari pengambilan sampel tekstur input pada koordinat tekstur yang dipancarkan oleh shader vertex. Shader piksel seperti itu dikatakan melakukan pengambilan sampel sederhana.
Beberapa shader piksel, seperti Gaussian blur, menghitung outputnya dari beberapa sampel input daripada hanya satu sampel. Shader piksel seperti itu dikatakan melakukan pengambilan sampel yang kompleks.
Hanya fungsi shader dengan input sederhana yang dapat memiliki input yang disediakan oleh fungsi shader lain. Fungsi shader dengan input kompleks harus disediakan dengan tekstur input untuk pengambilan sampel. Ini berarti bahwa Direct2D tidak akan menautkan shader dengan input kompleks ke pendahulunya.
Saat menggunakan pembantu HLSL Direct2D, Anda harus menunjukkan di HLSL apakah shader menggunakan input yang kompleks atau sederhana.
Contoh shader efek yang kompatibel dengan penautan
Menggunakan pembantu D2D, cuplikan kode berikut mewakili shader efek yang kompatibel dengan penautan sederhana:
#define D2D_INPUT_COUNT 1
#define D2D_INPUT0_SIMPLE
#include “d2d1effecthelpers.hlsli”
D2D_PS_ENTRY(LinkingCompatiblePixelShader)
{
float4 input = D2DGetInput(0);
input.rgb *= input.a;
return input;
}
Dalam contoh singkat ini perhatikan bahwa tidak ada parameter fungsi yang dideklarasikan, bahwa jumlah input dan jenis setiap input dideklarasikan sebelum fungsi entri, input diambil dengan memanggil D2DGetInput, dan arahan prapemrosesan tersebut harus ditentukan sebelum file pembantu disertakan.
Shader yang kompatibel dengan penautan harus menyediakan shader piksel sekali pakai reguler dan fungsi shader ekspor. Makro D2D_PS_ENTRY memungkinkan masing-masing dibuat dari kode yang sama, ketika digunakan bersama dengan skrip kompilasi shader.
Saat mengkompilasi shader yang lengkap, makro diuraikan menjadi kode berikut, yang memiliki tanda tangan input yang kompatibel dengan Efek D2D.
Texture2D<float4> InputTexture0;
SamplerState InputSampler0;
float4 LinkingCompatiblePixelShader(
float4 pos : SV_POSITION,
float4 posScene : SCENE_POSITION,
float4 uv0 : TEXCOORD0
) : SV_Target
{
float4 input = InputTexture0.Sample(InputSampler0, uv0.xy);
input.rgb *= input.a;
return input;
}
Saat mengkompilasi versi fungsi ekspor dari kode yang sama, kode berikut dihasilkan:
// Shader function version
export float4 LinkingCompatiblePixelShader_Function(
float4 input0 : INPUT0)
{
input.rgb *= input.a;
return input;
}
Perhatikan bahwa input tekstur, biasanya diambil dengan mengambil sampel Texture2D, telah diganti dengan input fungsi (input0).
Untuk melihat deskripsi langkah demi langkah lengkap tentang apa yang perlu Anda lakukan untuk menulis efek yang kompatibel dengan tautan, lihat tutorial efek kustom dan sampel efek gambar kustom Direct2D.
Mengkompilasi shader yang kompatibel untuk penautan
Agar dapat ditautkan, blob shader piksel yang diteruskan ke D2D harus berisi baik versi lengkap maupun versi fungsi ekspor dari shader tersebut. Ini dicapai dengan menyematkan fungsi ekspor yang dikompilasi ke area D3D_BLOB_PRIVATE_DATA.
Ketika shader ditulis dengan fungsi pembantu D2D, target kompilasi D2D harus ditentukan pada waktu kompilasi. Jenis target kompilasi D2D_FULL_SHADER dan D2D_FUNCTION.
Mengompilasi shader efek yang sesuai untuk pengkaitan adalah proses dua langkah:
Nota
Saat mengkompilasi efek menggunakan Visual Studio, Anda harus membuat file batch yang menjalankan perintah FXC dan menjalankan file batch ini sebagai langkah build kustom yang berjalan sebelum langkah kompilasi.
Langkah 1: Mengkompilasi fungsi ekspor
fxc /T <shadermodel> <MyShaderFile>.hlsl /D D2D_FUNCTION /D D2D_ENTRY=<entry> /Fl <MyShaderFile>.fxlib
Untuk mengompilasi versi fungsi ekspor shader, Anda harus meneruskan flag berikut ke FXC.
Bendera | Deskripsi |
---|---|
/T <ShaderModel> | Atur> ShaderModel <ke profil shader piksel yang sesuai seperti yang didefinisikan dalam Sintaks FXC . Ini harus merupakan salah satu profil yang tercantum di bawah "penautan shader HLSL". |
<MyShaderFile>.hlsl | Atur <MyShaderFile> sebagai nama file HLSL. |
/D D2D_FUNCTION | Definisi ini menginstruksikan FXC untuk mengkompilasi versi fungsi ekspor shader. |
/D D2D_ENTRY=<entri> | Atur entri <> ke nama titik masuk HLSL yang Anda tentukan di dalam makro D2D_PS_ENTRY. |
/Fl <MyShaderFile>.fxlib | Atur <MyShaderfile> pada tempat Anda ingin menyimpan versi fungsi ekspor dari shader. Perhatikan ekstensi .fxlib hanya untuk kemudahan identifikasi. |
Langkah 2: Kompilasi shader lengkap dan sematkan fungsi ekspor
fxc /T ps_<shadermodel> <MyShaderFile>.hlsl /D D2D_FULL_SHADER /D D2D_ENTRY=<entry> /E <entry> /setprivate <MyShaderFile>.fxlib /Fo <MyShader>.cso /Fh <MyShader>.h
Untuk mengompilasi versi lengkap shader Anda dengan versi ekspor yang disematkan, Anda harus meneruskan parameter berikut ke FXC.
Mengekspor spesifikasi fungsionalitas
Dimungkinkan - meskipun tidak disarankan - untuk menulis shader efek yang kompatibel tanpa menggunakan pembantu yang disediakan D2D. Harus diperhatikan bahwa baik sinyal input shader penuh maupun fungsi ekspor sesuai dengan spesifikasi D2D.
Spesifikasi untuk shader penuh sama dengan versi Windows sebelumnya. Secara singkat, parameter input untuk pixel shader haruslah SV_POSITION, SCENE_POSITION, dan satu TEXCOORD untuk setiap input efek.
Untuk fungsi ekspor, fungsi harus mengembalikan float4 dan inputnya harus salah satu dari jenis berikut:
Input sederhana
float4 d2d_inputN : INPUTN
Untuk input sederhana, D2D akan menyisipkan fungsi Sampel antara tekstur input dan fungsi shader, atau input akan disediakan oleh output fungsi shader lain.
Input kompleks
float4 d2d_uvN : TEXCOORDN
Untuk input kompleks, D2D hanya akan meneruskan koordinat tekstur seperti yang dijelaskan dalam dokumentasi Windows 8.
Lokasi output
float4 d2d_posScene : SCENE_POSITION
Hanya satu input SCENE_POSITION yang dapat ditentukan. Parameter ini hanya boleh disertakan jika perlu, karena hanya satu fungsi per shader tertaut yang dapat menggunakan parameter ini.
Semantik harus didefinisikan seperti di atas, karena D2D akan memeriksa semantik untuk memutuskan cara menautkan fungsi bersama-sama. Jika ada input fungsi yang tidak cocok dengan salah satu jenis di atas, fungsi akan ditolak untuk penautan shader.
Topik terkait