2016-06-24 3 views
1

Je suis un nouvel apprenant de DirectX11, et récemment je décide d'utiliser VS2015 pour exécuter le code.Shader Réflexion avec DirectX11

J'essaie de ne pas utiliser EffectFrameWork11, mais il y a une expérience très déplaisante lors de son utilisation.

J'essaie de changer les valeurs dans le tampon constant, sans EffectFramWork, je dois utiliser la carte fonction, le code de pseudo tout comme:

D3D11_MAPPED_SUBRESOURCE mapResource; 
ConstBuffer* constStruct = nullptr; 
auto result = m_d3dContext->Map(m_constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 
    0, &mapResource); 
if (FAILED(result)) 
{ 
    d3dHelper::ShowResultMessage(result); 
    return; 
} 

constStruct = (ConstBuffer*)mapResource.pData; 
constStruct->word = world; 
constStruct->view = view; 
constStruct->proj = proj; 
m_d3dContext->Unmap(m_constantBuffer, 0); 

m_d3dContext->VSSetConstantBuffers(0, 1, &m_constantBuffer); 
m_d3dContext->DrawIndexed(indexCount, indexOffset, vertexOffset); 

OK, il fonctionne bien, mais comme vous pouvez le voir, je d'écrire deux mêmes struct en C++ code et le code HLSL:

C++ code comme ceci:

struct ConstBuffer 
{ 
    XMMATRIX word; 
    XMMATRIX proj; 
    XMMATRIX view; 
}; 

code HLSL comme ceci:

cbuffer cbPerObject : register(b0) 
{ 
    matrix worldMatrix; 
    matrix projMatrix; 
    matrix viewMatrix; 
} 

Alors, existe-t-il un moyen pratique de mettre à jour un membre avec Constant Buffer?

+0

Vous devriez jeter un oeil à la [Kit d'outils DirectX] (https://github.com/Microsoft/DirectXTK) –

+0

merci ami, je l'ai regardé.Mais il suffit d'utiliser de la même manière.Si il y a un autre façon? –

+0

pourquoi ne pas utiliser 'EffectFrameWork11'? Je pense qu'il est pratique de mettre à jour les données pour utiliser 'EffectFrameWork11' plutôt que d'utiliser dx11 directement. Et DXTK est aussi bon. – zhangbaochong

Répondre

0

Non, vous ne le pouvez probablement pas, et aussi, vous avez besoin d'écrire le code Map/Unmap de toute façon. Mais, il y a un peu de lumière, vous pouvez obtenir la position d'octet de la variable à partir de la réflexion des shaders, mais je pense que cela ne vous aide pas beaucoup autrement. Dans mon cadre que je viens de la struct rempli alors j'ai un appel qui ressemble fondamentalement à ce

gpu->CommitGPUResource<LetsSayAPointLight>(pointLightStruct); 

et il ne fondamentalement que ce que vous avez écrit ci-dessus, donc ne vous inquiétez pas à ce sujet, il est laid, c'est une façon de faire avec.