2012-07-26 12 views
5

ich mit einer Textur auf die Shader schicken:Directx 11, mehrere Texturen senden diesen Code Shader

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

Natürlich ich die pTexture durch gemacht: D3DX11CreateShaderResourceViewFromFile

Shader: Texture2D Textur;

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

bin ich zur Zeit nur eine Textur an den Shader zu senden, aber ich möchte mehrere Texturen senden, ist, wie möglich das?

Vielen Dank.

+0

versuchen Sie zu mischen/multi-texturing? –

Antwort

7

Mit Texture Arrays. Wenn Sie Ihre D3D11_TEXTURE2D_DESC ausfüllen, schauen Sie sich das ArraySize Mitglied an. Diese Desc-Struktur wird an ID3D11Device::CreateTexture2D übergeben. Dann verwenden Sie in Ihrem Shader einen dritten Texcoord-Stichprobenindex, der angibt, auf welche 2D-Textur in dem Array Sie sich beziehen.

Update: ich einfach realisiert könnte es zu tun über mehrere Anrufe sprechen (das heißt für verschiedene geo), in dem Fall, dass Sie die Textur Ressourcenansicht Shader aktualisieren. Wenn Sie das Effekt-Framework verwenden, können Sie ID3DX11EffectShaderResourceVariable::SetResource verwenden oder alternativ eine neue Textur mit PSSetShaderResources erneut binden. Wenn Sie jedoch versuchen, zwischen mehreren Texturen zu mischen, sollten Sie Textur-Arrays verwenden.

Sie können auch 3D-Texturen betrachten, die eine natürliche Möglichkeit bieten, zwischen benachbarten Texturen im Array zu interpolieren (während 2D-Arrays automatisch an die nächste ganze Zahl geklammert werden) über das dritte Element in der Texkoord. Siehe HLSL sampleremarks.

+0

Interessant, krank versuchen Sie es ... –

+0

Nur eine Frage, wie kann ich wählen, wenn ich zusammenführen möchte, so möchte ich nur in einigen Situationen zusammenführen? Ich deaktiviere die zweite Texcoord? –

+0

Ich verwende das Effekt-Framework nicht. –

14

Sie können mehrere Texturen verwenden, solange ihre Anzahl nicht die Spezifikationen Ihres Shader-Profils überschreitet. Hier ein Beispiel: HLSL-Code:

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

C++ Code:

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

So zum Beispiel für über HLSL-Code wird es sein:

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

HLSL-Namen können arbi sein tray und muss keinem bestimmten Namen entsprechen - nur Indizes sind wichtig. Während "register (tXX);" Anweisungen sind nicht erforderlich, ich würde Ihnen empfehlen, sie zu verwenden, um Verwirrung darüber zu vermeiden, welche Textur welchem ​​Slot entspricht.

+0

* (SRV steht für Shader Resource View) – d7samurai