2012-07-26 18 views
5

przy użyciu tego kodu mogę wysłać jedną fakturę do shadera:DirectX 11, wysyłanie wielu tekstur do Shader

devcon->PSSetShaderResources(0, 1, &pTexture); 

Oczywiście zrobiłem pTexture przez: D3DX11CreateShaderResourceViewFromFile

Shader: Texture2D tekstury;

return color * Texture.Sample(ss, texcoord); 

Obecnie wysyłam tylko jedną teksturę do modułu cieniującego, ale chcę wysłać wiele tekstur, jak to możliwe?

Dziękuję.

+0

Czy próbujesz zrobić mieszanie/wielowarstwowe? –

Odpowiedz

7

Za pomocą Texture Arrays. Po wypełnieniu formularza D3D11_TEXTURE2D_DESC spójrz na członka ArraySize. Ta desc struct jest tą, która zostaje przekazana do ID3D11Device::CreateTexture2D. Następnie w module cieniującym należy użyć trzeciego indeksu próbkowania texcoord, który wskazuje, która tekstura 2D w tablicy, do której się odwołujesz.

Aktualizacja: Właśnie uświadomiłem sobie, można mówić o zrobieniu go na wiele połączeń (czyli dla różnych geo), w którym to przypadku aktualizacji widoku tekstury zasobów modułu cieniującego. Jeśli korzystasz z frameworku efektów, możesz użyć ID3DX11EffectShaderResourceVariable::SetResource lub ewentualnie ponownie powiązać nową teksturę za pomocą PSSetShaderResources. Jednakże, jeśli próbujesz mieszać między wieloma teksturami, powinieneś użyć tablic tekstur.

Możesz również zajrzeć do tekstur 3D, które zapewniają naturalny sposób interpolacji pomiędzy sąsiednimi teksturami w tablicy (podczas gdy tablice 2D są automatycznie zaciśnięte do najbliższej liczby całkowitej) za pośrednictwem trzeciego elementu w texcoord. Zobacz dokument HLSL sampleremarks.

+0

Interesujące, źle wypróbuj ... –

+0

Tylko jedno pytanie, jak mogę wybrać, jeśli chcę się połączyć, więc chcę tylko scalić w niektórych sytuacjach? Wyłączam drugi Texcoord? –

+0

Nie używam ram efektów. –

14

Można używać wielu tekstur, o ile ich liczba nie przekracza specyfikacji profilu cieniowania. Oto przykład: Kod HLSL:

Texture2D diffuseTexture : register(t0); 
Texture2D anotherTexture : register(t1); 

C++ Kod:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture); 

Tak na przykład dla powyższego kodu HLSL to będzie:

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV); 
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View) 

OR:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV}; 
devcon->PSSetShaderResources(0, 2, &textures); 

Nazwy HLSL mogą być arbi trary i nie musi odpowiadać żadnej konkretnej nazwie - liczy się tylko indeks. Podczas "register (tXX);" oświadczenia nie są wymagane, polecam ich użycie, aby uniknąć nieporozumień co do tekstury odpowiadającej wybranemu miejscu.

+0

* (SRV oznacza Shader Resource View) – d7samurai

Powiązane problemy