Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Direct2D, birden çok efekt grafı işleme geçişini tek bir geçişte birleştiren efekt gölgelendiricisi bağlama adı verilen bir iyileştirme kullanır.
- Efekt Gölgelendirici Bağlama Genel Bakış
- Efekt Gölgelendirici Bağlama Kullanma
- Bağlama uyumlu özel efekt gölgelendirici oluşturma
- Bağlama uyumlu efekt gölgelendiricisi
- Bağlantıya uygun bir gölgelendirici derleniyor
- İşlev belirtimlerini dışarı aktarma
- İlgili konular
Efekt Gölgeliği Bağlamaya Genel Bakış
Efekt gölgelendirici bağlama iyileştirmeleri, önceden derlenmiş gölgelendirici işlevlerini bağlayarak piksel ve köşe gölgelendiricilerinin çalışma zamanında oluşturulmasını sağlayan bir Direct3D 11.2 özelliği olan HLSL gölgelendirici bağlamasının üzerine oluşturulur. Aşağıdaki şekiller, efekt grafında etki gölgelendiricisi bağlama kavramını göstermektedir. İlk şekilde, dört işleme dönüşümü içeren tipik bir Direct2D efekt grafiği gösterilmektedir. Gölgelendirici bağlaması olmadan, her dönüşüm bir işleme geçişi tüketir ve bir ara yüzey gerektirir; toplamda bu grafik için 4 geçiş ve 3 ara geçiş gerekir.
İkinci şekil, her bir işleme dönüşümünün bağlanabilir bir işlev sürümüyle değiştirildiği aynı efekt grafiğini göstermektedir. Direct2D grafiğin tamamını bağlayabilir ve ara bileşenlere gerek kalmadan tek bir geçişte yürütür. Bu, GPU yürütme süresinde önemli bir azalma ve en yüksek GPU bellek tüketiminde azalma sağlayabilir.
Efekt gölgelendirici bağlaması, bir efekt içindeki bireysel dönüşümler üzerinde çalışır; Bu, tek bir efekte sahip bir grafiğin bile, bu efektin birden çok geçerli dönüşümü varsa gölgelendirici bağlamasından yararlanabileceği anlamına gelir.
Efekt Gölgelendirici bağlamasını kullanma
Efektler kullanan bir Direct2D uygulaması oluşturuyorsanız, efekt gölgelendiricisi bağlamadan yararlanmak için herhangi bir şey yapmanız gerekmez. Direct2D, her dönüşümü bağlamanın en uygun yolunu belirlemek için efekt grafiğini otomatik olarak analiz eder.
Etki yazarları, etkilerini "shader linking" destekleyecek şekilde uygulamaktan sorumludur; daha fazla bilgi için aşağıdaki "Shader linking" uyumlu özel efekt oluşturma bölümüne bakın. Tüm yerleşik efektler gölgelendirici bağlama işlemini destekler.
Direct2D yalnızca yararlı olduğu durumlarda bitişik işleme dönüşümlerini bağlar. İki dönüşümün bağlanıp bağlanmayacağını belirlerken birden çok faktörü dikkate alır. Örneğin, dönüşümlerden biri köşe veya işlem gölgelendiricileri kullanıyorsa gölgelendirici bağlaması yapılmaz, yalnızca piksel gölgelendiricileri bağlanabilir. Ayrıca, gölgelendirici bağlama ile uyumlu olacak şekilde bir efekt yazılmadıysa, çevresindeki dönüşümler onunla ilişkilendirilmeyecektir.
Böyle bir bağlantı tehlikesi olması durumunda Direct2D, tehlikenin bitişiğindeki dönüşümleri bağlamaz, ancak grafın geri kalanını bağlamaya çalışır.
Gölgelendirici bağlamaya uygun özel efekt yazma
Kendi özel Direct2D efektinizi yazarsanız, dönüşümlerinin efekt gölgelendirici bağlamasını desteklediğinden emin olmanız gerekir. Bu, önceki özel efektlerin uygulanma şekline göre bazı küçük değişiklikler gerektirir. Özel efektinizdeki bir dönüşüm gölgelendirici bağlamayı desteklemiyorsa, Direct2D bunu efekt grafiğinde ona bitişik dönüşümlerle ilişkilendirmez.
Özel efekt yazarı olarak, çeşitli temel kavramlar ve gereksinimlerden haberdar olmanız gerekir:
Arabirim uygulamalarını etkileyen hiçbir değişiklik
ID2D1DrawTransformgibi çeşitli etki arabirimlerini uygulayan herhangi bir kodu değiştirmeniz gerekmez.
Gölgelendiricilerin hem tam hem de dışa aktarım işlevi sürümünü sağlayın
Etkinizin gölgelendiricilerinin Direct2D tarafından bağlanabilen bir dışarı aktarma işlevi sürümü sağlamanız gerekir. Ayrıca, özgün, tam gölgelendiriciyi sağlamaya devam etmeniz gerekir; Bunun nedeni Direct2D'nin çalışma zamanında, gölgelendirici bağlamasının grafikteki belirli bir bağlantıya uygulanıp uygulanmayacağına bağlı olarak doğru gölgelendirici sürümünü seçmesidir.
Dönüşüm yalnızca tam piksel gölgelendirici blobu sağlıyorsa (ID2D1EffectContext::LoadPixelShader aracılığıyla), bitişik dönüşümlere bağlanmaz.
Yardımcı işlevleri
Direct2D, HLSL yardımcı işlevleri ve makrolar sağlar, böylece bir gölgelendiricinin hem tam hem de dışarı aktarma işlev sürümlerini otomatik olarak oluşturur. Bu yardımcılar d2d1effecthelpers.hlsli içinde bulunabilir. Buna ek olarak, HLSL derleyicisi (FXC), dışarı aktarma işlevi gölgelendiricisini tam gölgelendiricideki özel bir alana eklemenize olanak tanır. Bu şekilde, bir gölgelendiriciyi yalnızca bir kez yazmanız ve her iki sürümü de aynı anda Direct2D'ye geçirmeniz gerekir. Hem d2d1effecthelpers.hlsli hem de FXC derleyicisi Windows SDK'sının bir parçası olarak eklenir.
Yardımcı işlevler:
- D2DGetInput
- D2ÖrnekGiriş
- D2DSampleInputAtOffset
- D2DÖrnekGirişKonumda
- D2DGetInputCoordinate
- D2DGetScenePosition
- D2D_PS_ENTRY
Ayrıca, aşağıda belirtilen İhracat işlevi belirtimleri karşılandığı sürece, her bir gölgelendiricinin iki farklı sürümünü manuel olarak yazabilir ve bunları iki kez derleyebilirsiniz.
Piksel gölgelendiricileri yalnızca
Direct2D, işlem veya köşe gölgelendiricilerini bağlamayı desteklemez. Ancak, efektiniz hem köşe hem de piksel gölgelendiricisi kullanıyorsa piksel gölgelendiricisinin çıkışı yine de bağlanabilir.
Basit ve karmaşık örnekleme
Gölgelendirici işlevi bağlama, bir piksel gölgelendirici geçişinin çıkışını sonraki bir piksel gölgelendirici geçişinin girişine bağlayarak çalışır. Bu yalnızca, tüketen piksel gölgelendiricisi hesaplamasını gerçekleştirmek için yalnızca tek bir giriş değeri gerektirdiğinde mümkündür; bu değer normalde köşe gölgelendiricisi tarafından yayılan doku koordinatında bir giriş dokusu örneklemesinden gelir. Böyle bir piksel gölgelendiricinin basit örnekleme yaptığı söylenir.
Gauss bulanıklığı gibi bazı piksel gölgelendiricileri, çıktılarını tek bir örnek yerine birden çok giriş örneğinden hesaplar. Böyle bir piksel gölgelendiricinin karmaşık örnekleme yaptığı söylenir.
Yalnızca basit girişlere sahip gölgelendirici işlevlerinin girişleri başka bir gölgelendirici işlevi tarafından sağlanabilir. Karmaşık girişlere sahip gölgelendirici işlevleri, örneklenecek bir giriş dokusu ile sağlanmalıdır. Bu, Direct2D'nin karmaşık girişlere sahip bir gölgelendiriciyi öncülüne bağlamayacağı anlamına gelir.
Direct2D HLSL yardımcılarınıkullanırken, gölgelendiricinin karmaşık veya basit girişler kullanıp kullanmadığını HLSL'de belirtmelisiniz.
Bağlantı uyumlu bir efekt gölgelendirici örneği
Aşağıdaki kod parçacığı, D2D yardımcılarını kullanarak bağlama uyumlu basit bir efekt gölgelendiricisini temsil eder:
#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;
}
Bu kısa örnekte hiçbir işlev parametresi bildirilmediğini, giriş işlevinden önce her girişin giriş sayısının ve türünün bildirildiğini, girişin D2DGetInput çağrılarak alındığını ve yardımcı dosya dahil edilmeden önce önişlemci yönergelerinin tanımlanması gerektiğini unutmayın.
Bağlama uyumlu bir gölgelendirici hem normal bir tek geçişli piksel gölgelendiricisi hem de dışarı aktarma gölgelendiricisi işlevi sağlamalıdır. D2D_PS_ENTRY makro, gölgelendirici derleme betiğiyle birlikte kullanıldığında bunların her birinin aynı koddan oluşturulmasını sağlar.
Tam bir gölgelendirici derlenirken, makrolar D2D Efektleri ile uyumlu giriş imzasına sahip olacak şekilde aşağıdaki koda genişletilir.
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;
}
Aynı kodun dışarı aktarma işlevi sürümü derlenirken aşağıdaki kod oluşturulur:
// Shader function version
export float4 LinkingCompatiblePixelShader_Function(
float4 input0 : INPUT0)
{
input.rgb *= input.a;
return input;
}
Normalde bir Texture2D örneklemesi ile alınan doku verisinin bir işlev girişi (input0) ile değiştirildiğini unutmayın.
Bağlama uyumlu efekt yazmak için yapmanız gerekenlerin tam ve adım adım açıklamasını görmek için Özel efektler öğreticisi ve Direct2D özel görüntü efektleri örneğinebakın.
Bağlama işlemi için uyumlu olan gölgelendiriciyi derleme
Bağlanabilmesi için D2D'ye geçirilen piksel gölgelendirici blobu, gölgelendiricinin hem tam hem de dışarı aktarma işlevi sürümlerini içermelidir. Bu, derlenmiş dışarı aktarma işlevini D3D_BLOB_PRIVATE_DATA alanına ekleyerek gerçekleştirilir.
Gölgelendiriciler D2D yardımcı işlevleriyle yazıldığında, derleme zamanında bir D2D derleme hedefi tanımlanmalıdır. Derleme hedef türleri D2D_FULL_SHADER ve D2D_FUNCTION.
Bağlama uyumlu efekt gölgelendiricisi derlemek iki adımlı bir işlemdir:
Not
Visual Studio kullanarak bir etki derlerken, hem FXC komutlarını yürüten bir toplu iş dosyası oluşturmanız hem de bu toplu iş dosyasını derleme adımından önce çalışan özel bir derleme adımı olarak çalıştırmanız gerekir.
1. Adım: Dışarı aktarma işlevini derleme
fxc /T <shadermodel> <MyShaderFile>.hlsl /D D2D_FUNCTION /D D2D_ENTRY=<entry> /Fl <MyShaderFile>.fxlib
Gölgelendiricinizin dışarı aktarma işlevi sürümünü derlemek için FXC'ye aşağıdaki bayrakları geçirmeniz gerekir.
| Bayrak | Açıklama |
|---|---|
| /T <ShaderModel> | <ShaderModel>FXC Sözdizimi'nde tanımlandığı gibi uygun piksel gölgelendirici profiline ayarlayın. Bu, "HLSL gölgelendirici bağlama" altında listelenen profillerden biri olmalıdır. |
| <MyShaderFile>.hlsl | <MyShaderFile'ı HLSL dosyasının adı olarak>'e ayarlayın. |
| /D D2D_FUNCTION | Bu tanım FXC'ye gölgelendiricinin dışarı aktarma işlevi sürümünü derlemesini sağlar. |
| /D D2D_ENTRY=<giriş> | HLSL giriş noktasını, D2D_PS_ENTRY makro içindeki tanımınıza ayarlamak için, <girdisindeki> değerini değiştirin. |
| /Fl <MyShaderFile>.fxlib | Gölgelendiricinin dışarı aktarma işlevi sürümünü depolamak istediğiniz yeri <MyShaderfile> olarak ayarlayın. .fxlib uzantısının yalnızca tanımlama kolaylığı için olduğunu unutmayın. |
2. Adım: Tam gölgelendiriciyi derleme ve dışarı aktarma işlevini ekleme
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
Gömülü dışa aktarma sürümüyle gölgelendiricinizin tam sürümünü derlemek için FXC'ye aşağıdaki parametreleri geçirmeniz gerekir.
| Bayrak | Açıklama |
|---|---|
| /T <ShaderModel> | <ShaderModel>FXC Sözdizimi'nde tanımlandığı gibi uygun piksel gölgelendirici profiline ayarlayın. Bu, 1. Adımda belirtilen bağlama profiline karşılık gelen piksel gölgelendirici profili olmalıdır. |
| <MyShaderFile>.hlsl | <MyShaderFile> ayarını HLSL dosyasının adı olarak yapın. |
| /D D2D_FULL_SHADER | Bu tanım FXC'ye gölgelendiricinin tam sürümünü derlemesini sağlar. |
| /D D2D_ENTRY=<giriş> | <girdi>'i, D2D_PS_ENTRY() makrosunun içinde tanımladığınız HLSL giriş noktasının adı olarak ayarlayın. |
| /E <giriş> | <girdi>'i, D2D_PS_ENTRY() makrosunun içinde tanımladığınız HLSL giriş noktasının adı olarak ayarlayın. |
| /setprivate <MyShaderFile>.fxlib | Bu bağımsız değişken, FXC'ye 1. adımda oluşturulan ihracat fonksiyonu gölgelendiricisini D3D_BLOB_PRIVATE_DATA alanına yerleştirmesini talimat verir. |
| /Fo <MyShader>.cso | <MyShader>'i, son ve birleştirilmiş derlenmiş gölgelendiriciyi depolamak istediğiniz yere ayarlayın. |
| /Fh <MyShader>.h | <MyShader>'i son, birleştirilmiş başlığı depolamak istediğiniz yere ayarlayın. |
İşlev belirtimlerini dışarı aktarma
D2D tarafından sağlanan yardımcıları kullanmadan uyumlu bir efekt gölgelendiricisi yazmak mümkündür ( ancak önerilmez). Hem tam gölgelendirici hem de dışarı aktarma işlevi giriş imzalarının D2D belirtimlerine uygun olduğundan emin olmak için dikkatli olunmalıdır.
Tam gölgelendiriciler için belirtimler önceki Windows sürümleriyle aynıdır. Kısaca, piksel gölgelendiricisi giriş parametreleri SV_POSITION, SCENE_POSITION ve efekt girişi başına bir TEXCOORD olmalıdır.
Export işlevi için işlevin float4 döndürmesi ve girişlerinin aşağıdaki türlerden biri olması gerekir:
Basit giriş
float4 d2d_inputN : INPUTNBasit girişler için, D2D, giriş dokusu ve gölgelendirici işlevi arasına bir örnek işlevi ekler veya giriş başka bir gölgelendirici işlevinin çıkışı tarafından sağlanır.
Karmaşık giriş
float4 d2d_uvN : TEXCOORDNKarmaşık girişler için, D2D yalnızca Windows 8 belgelerinde açıklandığı gibi bir doku koordinatı geçirir.
Çıkış konumu
float4 d2d_posScene : SCENE_POSITIONYalnızca bir SCENE_POSITION girişi tanımlanabilir. Bağlı gölgelendirici başına yalnızca bir işlev bu parametreyi kullanabileceğinden, bu parametre yalnızca gerektiğinde dahil edilmelidir.
D2D işlevleri birbirine bağlamaya karar vermek için semantiği inceleyeceği için semantiğin yukarıdaki gibi tanımlanması gerekir. Herhangi bir işlev girişi yukarıdaki türlerden biriyle eşleşmiyorsa, gölgelendirici bağlantısı için işlev reddedilir.
İlgili konular