2012-09-29 13 views
7

Jestem trochę zdezorientowany i chcę tylko prosić was wszystkich o pomoc w przygotowaniu kilku pomysłów.Widok zasobów shaderów DirectX w Shaderach

Na przykład w shlonie HLSL (na przykład shaderem obliczeniowym) mogę zadeklarować sB StructuredBuffer, prawda? Czy MUSZĘ powiązać go z rejestrem, na przykład: register (t0)?

Od strony aplikacji mogę wywołać CSSetShaderResources (...). Pierwszy argument (StartSlot), czy ma coś wspólnego z małą liczbą za "t" w deklaracji rejestru?

Jeśli ustawię StartSlot jako 0 (na przykład) i ustawię drugi argument na 2. Czy mówię interfejsowi API, że będę wiązał dwa widoki zasobów Shader, jeden w rejestrze (t0) i drugi w rejestrze (t1)?

Jeśli zadeklaruję Text2D tex [10]: register (t0), mogę ustawić, wywołując CSSetShaderResources (0, 10, ...). Czy to oznacza, że ​​rejestry (t0 ~ t9) są zużyte?

Niestety dla takiego „szybkiego ognia” pytania, ale jestem po prostu naprawdę mylić i niektóre z moich testów wydają się dać confliting wyników ...

Każda pomoc będzie mile widziane.

Odpowiedz

4

Warto więc odpowiedzieć w kolejności:

Tak można oczywiście zadeklarować StructuredBuffer w cieniującego obliczeniowej (faktycznie można zadeklarować go dla każdego typu shader).

Jeśli nie korzystasz z frameworka efektów (technik), musisz zadeklarować rejestr, aby moduł cieniujący wiedział, gdzie odczytać dane (używając frameworka efektów, robi to po prostu pod maską, ale nadal możesz wyraźnie zadeklarować).

CSSetShaderResources informuje, aby powiązać zasoby N z gniazda startowego, aby Twój opis użycia 0,2 był prawidłowy.

W przypadku tablic tekstur musiałem uruchomić PIX, aby to sprawdzić, ale tak naprawdę to powiedziałeś.

Texture2D tex[10] : register(t0); 

będzie oznaczać, że każdy indeks tekstury zostaną przydzielone szczelinę wyjściową z rejestru został określony, więc trzeba zadzwonić CSSetShaderResources (0,10), srvarray ich ustawiania.

+1

dzięki. To oczyszcza wiele rzeczy ... Aby się upewnić, że dla Text2D tex [10]: register (t0), nie mogę zadeklarować innej zmiennej za pomocą rejestru (t1) lub rejestru (t2) ... aż po zarejestruj się (t9), ponieważ wszystkie zostaną zużyte, prawda? (Dałem ci +1, bardzo wyraźną odpowiedź, dziękuję jeszcze raz.) Zaznaczę to jako zaakceptowane po tym, jak usunę ten ostatni mały punkt) – l3utterfly

+0

To prawda, jeśli spróbujesz powiązać kilka zmiennych z tym samym rejestrem, kompilator da ci ten błąd "nakładające się semantyki rejestrów jeszcze nie zaimplementowane". – catflier

+0

Dzięki. Przyjęta odpowiedź. – l3utterfly

2

Bardzo fajne wyjaśnienie! Też się pogubiłem i po twoich pytaniach i wyjaśnieniach jest dla mnie jasne!

Ale znalazłem dobry przykład tego posta, który chcę udostępnić. Wygląda na to, że rozpoczyna on licznik gniazda dla każdego typu SetShaderResources. Wszystkie shadery (VS, HS, DS, PS) wydają się mieć swój własny licznik. W tym przypadku kod z przykładu NVidia:

Kod Shaderclass:

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); 

Pierwszy posiadający dwa środki, a więc obok gniazda (linia 4), należy dodać 2 do szczeliny wyjściowej (0 + 2 = 2). Każdy SetShaderResources musi rozpoczynać się od 0, ale możesz to zrobić w różnych miejscach kodu, dlatego nie ma tu miejsca na 0 DS i PS. Czasami po usunięciu linii nadal działa, ale dane są przełożone. Teraz widzisz pierwsze cztery w HLSL na linii t0, t1, t8 i t9, gdzie drugi rejestr był powiązany gdzie indziej.

Kod HLSL:

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);