2012-09-29 27 views
7

Şu an biraz kafam karıştı ve sadece birkaç fikrin anlaşılmasına yardımcı olmanızı istiyorum.Shader'larda DirectX Shader Resource View

Bir HLSL gölgelendiricide (örneğin gölgelendiriciyi hesapla) YapısalBuffer sb bildirebilir miyim? Aşağıdaki gibi bir kayıt defterine bağlamak zorunda mıyım? Kayıt (t0)?

Uygulamadan CSSetShaderResources (...) dosyasını arayabilirim. İlk argüman (StartSlot), kayıt bildiriminde "t" nin arkasındaki küçük sayı ile ilgili bir şey var mı?

StartSlot'u 0 (örneğin) olarak ayarlıyorum ve ikinci bağımsız değişkeni 2 olarak ayarladım. API'ye iki Shader Kaynak Görünümü bağlayacağımı söylüyorum, biri kayıt (t0) ve diğeri de kayıt (t1)?

Texture2D yazısını bildirirseniz [10]: register (t0) CSSetShaderResources (0, 10, ...) çağırarak bunu ayarlayabilirim. Bu, yazmaçların (t0 ~ t9) hepsinin tükendiği anlamına mı geliyor?

sorudan böyle bir "hızlı ateş" için üzgünüm

, ama sadece gerçekten kafam karıştı ve benim testlerin bazı confliting sonuçları vermek gibi görünüyor ...

Herhangi bir yardım mutluluk duyacağız.

cevap

4

Yani sırayla cevap alalım:

Evet tabii bir hesaplama gölgelendiricideki (aslında gölgelendiriciye türlerinden herhangi birini ilan edebilir) bir StructuredBuffer bildirebilirsiniz.

Efekt çerçevesini (teknikleri) kullanmıyorsanız, bir kayıt bildirmeniz gerekir, böylece gölgelendirici verilerinizi nereden okuyacağını bilecektir (efekt çerçevesini kullanarak sadece başlık altında yapar, ancak yine de yapabilirsiniz açıkça beyan etmek).

CSSetShaderResources, N kaynağını bir başlangıç ​​yuvasından bağlamayı belirtir, bu nedenle 0,2 kullanım açıklamanız doğrudur.

Doku dizisi için, kontrol etmek için PIX'i çalıştırmam gerekiyordu, ama gerçekten böyle söylediniz.

Texture2D tex[10] : register(t0); 

her doku endeksi belirttiğiniz register başlayarak bir yuva tahsis edilecektir anlamına Will, bu nedenle CSSetShaderResources (0,10, srvarray) bunları aramak gerekir.

+1

Çok teşekkürler. Bu çok şey temizler ... Sadece Texture2D tex için [10]: kayıt (t0), kayıt (t1) veya register (t2) kullanarak başka bir değişken bildiremem ... register (t9) çünkü hepsi tamam olacak, değil mi? (Size bir +1, çok açık bir cevap verdim, tekrar teşekkürler. Bu son küçük noktayı temizledikten sonra kabul edilir olarak işaretleyeceğim) – l3utterfly

+0

Bu, aynı kayda birkaç değişkene bağlanmayı denerseniz, doğrudur. derleyici size bu hatayı "henüz uygulanmayan çakışan yazma semantiği" verecektir. – catflier

+0

Teşekkürler. Kabul edilen cevap. – l3utterfly

2

Çok güzel açıklama! Ayrıca kafam karıştı ve sorularınız ve açıklamalarınız bana açık oldu!

Ancak paylaşmak istediğim bu gönderi için güzel bir örnek buldum. Her SetShaderResources Type için slotun sayacını başlatıyor gibi görünüyor. Tüm gölgelendiriciler (VS, HS, DS, PS) kendi sayaçlarına sahip gibi görünüyor. Burada NVidia örnek kod:

Shaderclass kodu:

pd3dDeviceContext->HSSetShaderResources(0, 2, Resources); 
pd3dDeviceContext->HSSetShaderResources(8, 1, &m_pRegularWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(9, 1, &m_pQuadWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->DSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(10, 1, &pNormalMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(3, 1, &pTexRenderRV11); 

ilk iki bilgi tutma, böylece bir sonraki yuvası olan (satır 4), başlangıç ​​yarık (0 + 2 2 eklemek zorundadır = 2). Her SetShaderResources, 0 ile başlamalıdır, ancak bunu kodunuzdaki farklı yerlerde yapabilirsiniz, bu nedenle DS ve PS için burada 0 slot yoktur. Bazı zamanlar bir satırı kaldırırsanız hala çalışır, ancak veriler ertelenir. Şimdi, HLSL'deki ilk dördünü t0, t1, t8 ve t9 satırlarında görüyorsunuz, diğer kayıt başka bir yere bağlıydı.

HLSL kodu:

Texture2D<float> GregoryStencil    : register(t0); 
Texture2D<uint> Index      : register(t1);  
Texture2D<float> g_txHeight     : register(t2);  
Texture2D<float> g_depth      : register(t3); 
Texture2D g_FloorTexture      : register(t4); 
Texture2D<float3> regularPatchControlPoints : register(t5); 
Texture2D<float3> gregoryPatchControlPoints : register(t6); 
Texture2D<float4> g_floorHeight    : register(t7); 
Texture2D<float2> RegularWatertightUVs  : register(t8); 
Texture2D<float2> QuadWatertightUVs   : register(t9); 
Texture2D<float3> g_txNormal     : register(t10);