Question

en utilisant ce code, je peux envoyer une texture au shader :

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

Bien sûr, j'ai réalisé la pTexture en :D3DX11CreateShaderResourceViewFromFile

Nuancier :TextureTexture 2D ;

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

Je n'envoie actuellement qu'une seule texture au shader, mais j'aimerais envoyer plusieurs textures, comment est-ce possible ?

Merci.

Était-ce utile?

La solution

En utilisant Tableaux de textures.Lorsque vous remplissez votre D3D11_TEXTURE2D_DESC regarde le ArraySize membre.Cette structure desc est celle qui est transmise à ID3D11Device::CreateTexture2D.Ensuite, dans votre shader, vous utilisez un troisième index d'échantillonnage texcoord qui indique à quelle texture 2D du tableau vous faites référence.

Mise à jour: Je viens de réaliser que vous envisagiez peut-être de le faire sur plusieurs appels (c'est-à-direpour différentes zones géographiques), auquel cas vous mettez à jour la vue des ressources de texture du shader.Si vous utilisez le framework d'effets, vous pouvez utiliser ID3DX11EffectShaderResourceVariable :: SetResource, ou bien reliez une nouvelle texture en utilisant PSSetShaderResources.Cependant, si vous essayez de mélanger plusieurs textures, vous devez utiliser des tableaux de textures.

Vous souhaiterez peut-être également vous pencher sur les textures 3D, qui fournissent un moyen naturel d'interpoler entre les textures adjacentes dans le tableau (alors que les tableaux 2D sont automatiquement limités à l'entier le plus proche) via le 3ème élément du texcoord.Voir le HLSL sample remarques.

Autres conseils

Vous pouvez utiliser plusieurs textures tant que leur comptage ne dépasse pas les spécifications de votre profil de shader.Voici un exemple: Code HLSL:

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

CODE C ++:

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

Donc, par exemple pour le code HLSL ci-dessus, il sera:

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

ou:

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

Les noms HLSL peuvent être arbitraires et ne doivent pas correspondre à aucun nom spécifique - seuls les index nets.Tandis que "registre (TXX);"Les déclarations ne sont pas nécessaires, je vous recommanderais de les utiliser pour éviter toute confusion quant à la texture correspondant à la fente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top