Aracılığıyla paylaş


Efekt grafiklerinde hassasiyet ve nümerik kesme

Direct2D kullanarak etkileri işleyen uygulamalar, sayısal duyarlık açısından istenen kalite ve öngörülebilirlik düzeyine ulaşmak için dikkatli olmalıdır. Bu konuda, Aşağıdaki durumlarda yararlı olan Direct2D'deki en iyi yöntemler ve ilgili ayarlar açıklanmaktadır:

  • Efekt grafınız [0, 1] aralığının dışındaki yüksek sayısal duyarlığa veya renklere dayanır ve bunların her zaman kullanılabilir olduğundan emin olmak istersiniz
  • Efekt grafınız, ara renkleri [0, 1] aralığına sıkıştırmak için işleme uygulamasına dayanır ve bu sıkıştırmanın her zaman gerçekleşmesini istersiniz.

Direct2D genellikle bir efekt grafiğini bölümlere ayırır ve her bölümü ayrı bir adımda işler. Bazı adımların çıkışı, varsayılan olarak sınırlı sayısal aralık ve duyarlığa sahip olan ara Direct3D dokularında depolanabilir. Direct2D, bu ara dokuların kullanılıp kullanılmadığı veya nerede kullanıldığı hakkında garanti vermez. Bu davranış, GPU özelliklerine göre ve Windows sürümleri arasında farklılık gösterebilir.

Windows 10'da Direct2D, gölgelendirici bağlama kullanımı nedeniyle daha az ara doku kullanır. Bu nedenle Direct2D, varsayılan ayarlarla önceki Windows sürümlerinden farklı sonuçlar üretebilir. Bu öncelikle bir efekt grafında gölgelendirici bağlamanın mümkün olduğu senaryoları etkiler ve bu grafik ayrıca genişletilmiş aralıklı çıkış renkleri üreten efektler içerir.

Efekt işleme ve ara bileşenlere genel bakış

Bir efekt grafiğini işlemek için, Direct2D önce "dönüşümlerin" temel grafiğini bulur; burada dönüşüm, bir efekt içinde kullanılan bir grafik düğümüdür. Direct2D'nin kullanması için Direct3D gölgelendiricileri sağlayanlar da dahil olmak üzere farklı dönüşüm türleri vardır.

Örneğin, Direct2D bir efekt grafiğini aşağıdaki gibi işleyebilir:

efekt grafiği, ara dokular

Direct2D, etki grafiğini işlemek için kullanılan ara doku sayısını azaltma fırsatlarını arar; bu mantık uygulamalar için opaktır. Örneğin, aşağıdaki grafik Direct2D tarafından tek bir Direct3D çizim çağrısı kullanılarak ve ara doku olmadan işlenebilir:

Ara doku içermeyen efekt grafiği

Windows 10'dan önce, aynı efekt grafı içinde birden çok piksel gölgelendiricisi kullanılıyorsa Direct2D her zaman ara dokular kullanırdı. Renk değerlerini (örneğin Parlaklık veya Doygunluk) ayarlayan yerleşik efektlerin çoğu piksel gölgelendiricilerini kullanarak bunu yapar.

Windows 10'da Direct2D artık bu gibi durumlarda ara dokuları kullanmaktan kaçınabilir. Bunu, bitişik piksel gölgelendiricilerini dahili olarak bağlayarak yapar. Örneğin:

Birden çok piksel gölgelendiricisi olan ve ara doku içermeyen windows 10 efekt grafiği

Bir grafikteki tüm bitişik piksel gölgelendiricilerinin birbirine bağlanamadığını ve bu nedenle Windows 10'da yalnızca belirli grafiklerin farklı çıkışlar oluşturabileceğini unutmayın. Tüm ayrıntılar için bkz. Efekt Gölgelendiricisi Bağlama. Birincil kısıtlamalar şunlardır:

  • İlk efekt, birden çok efektin girişine bağlıysa, çıkışını kullanan diğer efektlerle ilişkilendirilmeyecektir.
  • İlk efektin çıktısından farklı bir mantıksal konumda girdisini örneklediği durumlarda, bu efektin bir efekt kümesi ile girdi olarak ilişkilendirilmesi mümkün olmayacaktır. Örneğin, bir Renk Matrisi efekti girişiyle bağlantılı olabilir, ancak Konvolüsyon efekti bağlantılı olmaz.

Yerleşik efekt davranışı

Birçok yerleşik efekt, giriş renkleri bu aralıkta olsa bile, premultiply edilmemiş renk uzayında [0, 1] aralığının dışında renkler üretebilir. Bu durumda, bu tür renkler sayısal kırpmaya tabi olabilir. Yerleşik efektlerin genellikle önceden çoğaltılmış alanda renkler üretmesine rağmen, renk aralığının çoğaltılmamış alanda dikkate alınmasının önemli olduğuna dikkat edin. Bu, renklerin sonradan diğer efektler tarafından unpre-multiply edilse bile aralık içinde kalmasını sağlar.

Bu aralık dışı renkleri yayabilecek bazı efektler bir "ClampOutput" özelliği sunar. Bunlar şunlardır:

Bu efektlerde ClampOutput özelliğini TRUE olarak ayarlamak, gölgelendirici bağlama gibi faktörlerden bağımsız olarak tutarlı bir sonuç elde edilmesini sağlar. Sıkıştırmanın, çarpılmamış uzayda gerçekleştiğine dikkat edin.

Diğer yerleşik efektler, renk pikselleri (ve varsa "Renk" özellikleri) bu aralık içinde olsa bile, ön çarpılmamış bir alanda [0, 1] aralığının ötesindeki çıkış renklerini üretebilir. Bunlar şunlardır:

Efekt grafı içinde sayısal kırpmayı zorlama

Yukarıda listelenen ve ClampOutput özelliği olmayan efektler kullanılırken, uygulamalar sayısal sıkıştırmayı zorlamayı göz önünde bulundurmalıdır. Bu, piksellerini sıkıştıran grafiğe ek bir efekt eklenerek yapılabilir. 'ClampOutput' özelliği TRUE olarak ayarlanmış ve 'ColorMatrix' özelliği varsayılan (geçiş) değeri olarak bırakılarak bir Renk Matrisi efekti kullanılabilir.

Tutarlı sonuçlar elde etmek için ikinci bir seçenek, Direct2D'nin daha fazla duyarlığı olan ara dokular kullanmasını istemektir. Bu, aşağıda açıklanmıştır.

Ara dokuların kesinliği denetleniyor

Direct2D, bir grafiğin hassasiyetini kontrol etmenin birkaç yolunu sağlar. Direct2D'de yüksek duyarlıklı biçimleri kullanmadan önce uygulamaların GPU tarafından yeterince desteklendiklerinden emin olması gerekir. Bunu denetlemek için ID2D1DeviceContext::IsBufferPrecisionSupportedkullanın.

Uygulamalar, tüm arabellek duyarlıklarının cihazdaki gerçek GPU donanımından bağımsız olarak desteklendiğini garanti etmek için WARP (yazılım öykünmesi) kullanarak bir Direct3D cihazı oluşturabilir. Bu, diske kaydederken fotoğrafa efekt uygulama gibi senaryolarda önerilir. Direct2D GPU'lar üzerinde yüksek duyarlıklı arabellek biçimlerini desteklese bile, bazı düşük güçlü mobil GPU'ların gölgelendirici aritmetik ve örneklemesinin sınırlı duyarlılığı nedeniyle bu durumlarda 9.X özellik seviyesindeki GPU'larda WARP kullanılması önerilir.

Aşağıdaki her durumda, istenen duyarlık aslında Direct2D'nin kullanacağı minimum duyarlıktır. Ara değerler gerekli değilse daha yüksek duyarlık kullanılabilir. Direct2D, aynı grafın farklı bölümleri veya tamamen farklı grafikler için ara dokuları da paylaşabilir. Bu durumda Direct2D, tüm ilgili işlemler için istenen maksimum duyarlığı kullanır.

ID2D1DeviceContext::SetRenderingControls'tan Hassasiyet Seçimi

Direct2D'nin ara dokularının duyarliğini denetlemenin en basit yolu, ID2D1DeviceContext::SetRenderingControlskullanmaktır. Bu ayar, bir hassasiyet doğrudan efektler veya dönüşümler üzerinde elle ayarlanmadıkça, tüm ara dokuların hassasiyetini denetler.

if (Device->IsBufferPrecisionSupported(D2D1_BUFFER_PRECISION_32BPC_FLOAT))
{
  // Get the current rendering controls
  D2D1_RENDERING_CONTROLS renderingControls = {};
  Context->GetRenderingControls(&renderingControls);

  // Switch the precision within the rendering controls and set it
  renderingControls.bufferPrecision = D2D1_BUFFER_PRECISION_32BPC_FLOAT;
  Context->SetRenderingControls(&renderingControls);
}
              

Girişlerden ve çizim hedeflerinden hassas seçim

Uygulamalar, ara dokuların kesinliğini kontrol etmek için bir etki grafiği girişlerinin kesinliğinden de yararlanabilir. ID2D1DeviceContext::SetRenderingControlskullanılarak bir arabellek duyarlığı belirtilmedikçe ve doğrudan efektlerde ve dönüştürme işlemlerinde elle ayarlanmadığı sürece bu durum geçerlidir.

Girişlerin efektlere olan hassasiyetleri, aşağı akıştaki ara işlemlerin hassasiyetini seçmek için grafikte yayılır. Efekt grafiğindeki farklı dalların bir araya geldiği durumlarda, girişlerden birinin en yüksek kesinliği kullanılır.

Direct2D bit eşlem temelinde seçilen duyarlık, piksel biçiminden belirlenir. ID2D1ImageSource için seçilen duyarlık, ID2D1ImageSourceoluşturmak için kullanılan temel alınan IWICBitmapSource'un WIC piksel biçiminden belirlenir. Direct2D'nin, Direct2D ve GPU tarafından desteklenmeyen duyarlıkları kullanan WIC kaynaklarıyla görüntü kaynakları oluşturulmasına izin vermediğini unutmayın.

Direct2D, girişlerine göre bir etkiye duyarlık atamama olasılığına sahiptir. Bu durum, bir efektin girişi olmadığında veya belirli bir duyarlığı olmayan ID2D1CommandList kullanıldığında oluşur. Bu durumda, ara dokuların kesinliği, bağlamın geçerli işleme hedefi olarak ayarlanan bit eşlem kümesinden belirlenir.

Doğrudan efektler ve dönüşümler üzerinde hassasiyet seçimi

Ara dokular için en düşük duyarlık, bir efekt grafı içindeki açık konumlarda da ayarlanabilir. Bu yalnızca gelişmiş senaryolar için önerilir.

En düşük duyarlık, bir efekt üzerinde aşağıdaki gibi bir özellik kullanılarak ayarlanabilir:

if (Device->IsBufferPrecisionSupported(D2D1_BUFFER_PRECISION_32BPC_FLOAT))
{
  hr = Effect->SetValue(D2D1_PROPERTY_PRECISION, D2D1_BUFFER_PRECISION_32BPC_FLOAT);
}
              

Bir efekt uygulaması içinde minimum duyarlık ID2D1RenderInfo::SetOutputPrecision kullanılarak aşağıdaki gibi ayarlanabilir:

if (EffectContext->IsBufferPrecisionSupported(D2D1_BUFFER_PRECISION_32BPC_FLOAT))
{
  hr = RenderInfo->SetOutputBuffer(
  D2D1_BUFFER_PRECISION_32BPC_FLOAT,
  D2D1_CHANNEL_DEPTH_4);
}
              

Efekt üzerine ayarlanan hassasiyetin, aşağıdaki efektlerde farklı bir hassasiyet ayarlanmadığı sürece, aynı efekt grafiğindeki aşağıdaki efektlere yayılacağını unutmayın. Bir efekt içindeki bir dönüşümde ayarlanan duyarlık, ardıl dönüşüm düğümlerindeki duyarlığı etkilemez.

Aşağıdaki tam özyinelemeli mantık, belirli bir dönüştürme düğümünün çıkışını depolayan bir ara bellekteki minimum hassasiyeti belirlemek için kullanılır.

Ara arabellek minimum hassasiyet mantığı