2017-02-22 4 views
1

J'essaie d'écrire du code DirectX qui prend un shader compilé et utilise la réflexion pour générer automatiquement des dispositions d'entrée pour les vertex shaders. Je simple vertex shader qui est conçu pour tirer parti de l'instanciation, c'est l'entrée accepte:DirectX 11 Vertex Shader Réflexion

struct VertexIn 
{ 
    // Per-vertex data 
    float3 pos  : POSITION; 
    float4 color : COLOR; 

    // Per-instance data 
    matrix worldMatrix : WORLDMATRIX; 
}; 

Et ma mise en page, si je devais l'écrire à la main, serait:

// Per-vertex data 
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
// Per-instance data. 
{ "WORLDMATRIX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, 
{ "WORLDMATRIX", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, 
{ "WORLDMATRIX", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, 
{ "WORLDMATRIX", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 } 

quand je pense que le shader compilé je reçois les paramètres nombre d'entrées correct, mais lorsque je tente de lire les descriptions d'entrée par D3D11_SIGNATURE_PARAMTER_DESC, je ne peux pas trouver les détails que je dois remplir les D3D11_INPUT_ELEMENT_DESC membres InputSlot, InputSlotClass et InstanceDataStepRate? Est-ce que je cherche dans la mauvaise description pour cette information ou est-ce que l'obtention de détails d'instanciation n'est pas possible par réflexion?

Si ce n'est pas possible alors je devine que la seule autre alternative que j'ai est de passer la disposition d'entrée de vertex prévue et de vérifier tous les paramètres?

Répondre

1

Il n'est pas possible de connaître les valeurs pour InputSlot, InputSlotClass et InstanceDataStepRate, avec un seul vertex shader. C'est une question de liaison de données, par rapport au traitement de données. Le vertex shader traite les données, mais la disposition d'entrée définit comment les données sont transmises au shader. Par exemple, en regardant votre définition d'entrée de shader, vous n'indiquez pas (autre que le commentaire) que worldMatrix est un membre par instance. En fait, ce n'est pas forcément le cas: vous pouvez facilement créer une mise en page d'entrée et une liaison de tampon de vertex qui ne font pas partie des données par instance, en utilisant le même code de vertex shader. Vous pouvez également créer une convention de dénomination sémantique dans le code de shader pour dicter quelles sont les valeurs de la disposition d'entrée qui sont instanciées et leur débit d'instanciation. Par exemple:

matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1; 

En analysant la sémantique, vous pouvez obtenir ce qu'il est instancié, la fente d'entrée et la fréquence de pas. Cependant, un tel système pourrait être plus difficile que cela en vaut la peine. À un certain point, vous aurez besoin de savoir quelles données d'entrée vous avez, et comment elles seront liées à un shader que vous avez écrit, dictant ainsi la disposition d'entrée.

+0

Ah c'est un point juste en ce qui concerne le commentaire dans le shader lui-même, il ne mentionne pas réellement quelque chose au sujet des numéros d'emplacement. J'aime l'idée sémantique, pourrait essayer. Quand vous mentionnez que vous avez besoin de savoir quelles sont vos données d'entrée, qu'entendez-vous par là? Des appels tels que IASetVertexBuffers? – TheRarebit

+0

Oui, je voulais dire que vous aurez besoin de savoir quelles données de vertex vous avez (par exemple, celles définies avec IASetVertexBuffers). Alors que vous pourriez mettre un schéma dans le shader pour définir cela, à la fin, vous devrez toujours avoir les données de vertex. – MuertoExcobito

+0

Okay ouais je comprends, tout ne peut pas être automatisé je suppose, j'aime l'idée de la génération de mise en page d'entrée étant automatisé si peut donner à vos suggestions un essai. Bravo pour les commentaires. – TheRarebit