2010-07-07 17 views
2

Ok, donc en supposant que je l'ai, quelque part dans mon Shader, une déclaration comme suit (Notez que je suis d'activer le support héritage à partager Shaders entre DX9 et DX10):D3D10 HLSL: Comment lier une texture à un Texture2D global par réflexion?

Texture2D DiffuseMap; 

je peux compiler le Shader sans problème, mais Je suis à une légère perte quant à la façon dont je lie un ShaderResourceView à "DiffuseMap". Quand je "réfléchis" le shader j'ai plutôt supposé qu'il apparaîtrait parmi la variable dans un tampon constant. Ce n'est pas le cas. En fait, je n'arrive pas à l'identifier nulle part. Alors, comment puis-je savoir quelle texture "stage" (pour utiliser le terme DX9) que je devrais lier le ShaderResourceView aussi? Edit: J'ai découvert que je pouvais identifier le nom de l'échantillonneur en utilisant "GetResourceBindingDesc". Je ne sais pas qui me aide du tout si :(

Edit2. De même, je n'avais pas remarqué que son même sous DX9 et ... à savoir que je ne peux obtenir l'échantillonneur

Edit3: mon Texture2D et Sampler ressemblent à ceci:

Texture2D DiffuseMap : DiffuseTexture; 
sampler DiffuseSampler = sampler_state 
{ 
    Texture = (DiffuseMap); 
    MinFilter = Linear; 
    MaxFilter = Linear; 
}; 

maintenant, dans le cadre de travail de l'effet que je pouvais obtenir le Texture2D par la sémantique « DiffuseTexture » Je pourrais alors faire un ResourceView (de D3D10)/Texture (D3D9) au Texture2D. Hélas, il ne semble pas y avoir de moyen de gérer la «sémantique» en utilisant les shaders standards de bog (ce serait génial de savoir comment D3D le fait, mais étudier le framework d'effets D3D11 ne m'a rien ar. Il semble que ce soit en train de le lire à partir des données binaires, c'est-à-dire compilées, et je ne vois que "DiffuseSampler" là-dedans).

+0

Vous avez donc un fichier DX9 .fx (ou juste .vs/.ps?), Et vous voulez le compiler et l'exécuter dans un contexte DX10 en utilisant la réflexion? – Stringer

+0

Effectivement ... oui. – Goz

+0

Hmm, je vois votre problème maintenant. Mais si vous avez "DiffuseSampler", il suffit de savoir que vous avez besoin de lier à un slot donné un SRV d'une texture diffuse, non? Vous ne savez pas si vous devez également lier un état d'échantillonneur DX10 en utilisant * SetSamplers dans le même emplacement. – Stringer

Répondre

1

Hmm permettez-moi de reformuler cela. Du côté C++, vous avez un tas de textures chargées et de SRV associées. Maintenant, vous voulez définir un shader (qui vient de DX9) et sans regarder comment le shader est écrit, lier les SRV (diffuse pour diffuser l'emplacement, spéculaire, cartes normales-vous l'appelez). Droite?

Je pense que vous avez dit que vous le mieux est utilisé GetResourceBindingDesc:

HRESULT GetResourceBindingDesc(
    [in] UINT ResourceIndex, 
    [in] D3D10_SHADER_INPUT_BIND_DESC *pDesc 
); 

Je pense que vous devez itérer chaque ResourceIndex (à partir de 0, 1, 2, etc.), si HRESULT est S_OK alors vous avez pDesc.BindPoint qui représentera la position du SRV associé dans le tableau ppShaderResourceViews d'un appel *SetShaderResources. Et pDesc.Name (comme "DiffuseMap") vous donne les informations d'association.

+0

GetResourceBindingDesc me renvoie l'échantillonneur pas le Texture2D, cependant :(Merci pour la confirmation sur la partie BindPoint cependant.Je l'ai deviné, mais je n'étais pas sûr.Ce serait vraiment bien si vous pouviez obtenir à l'utilisateur- sémantique définie (comme dans un fichier d'effets) – Goz

+0

Bien dans DX9 Les sampleurs et les textures sont les mêmes, n'est-ce pas? Seulement DX10/11 fait une séparation nette entre les samplers et les textures (ou les tampons) – Stringer

+0

Ils ne sont pas les mêmes dans DX9 AFAIK Vous pouvez avoir plusieurs samplers attachés à la même texture si vous le souhaitez ... Je ne vois pas de raison que vous voudriez mais vous pouvez le faire (encore une fois AFAIK) – Goz