2017-05-20 5 views
1

J'ai une question bizarre graphique ne se passe sur mon Intel HD Graphics 530direct x 12 sur l'image vacillante Intel dur

Lors du rendu d'une image, certains pixels changement de couleur au hasard. Voir l'image suivante: Bug

Pour les pixels problématiques, les graphismes montrent débogueur que la couleur émise par le pipeline graphique est correcte. Mais la couleur affichée par pixel est fausse. Voir: Debugger

De mes recherches, j'ai trouvé que ces pixels semblent utiliser des informations provenant des matériaux des autres. Mes informations sur les matériaux sont gérées par un tas de descripteurs. Ainsi, le commutateur entre les graphiques table de descripteurs racine dans ma boucle de rendu semble être mon problème (quand je dessine un seul objet tout est très bien)

Voici l'extrait de code i utiliser:

void ForwardLighningEffect::pushCommands(ForwardLigthningPushArgs data, ID3D12GraphicsCommandList* commandList, int frameIndex) { 

// set PSO 
commandList->SetPipelineState(m_mainPipelineStateObject); 

// set root signature 
commandList->SetGraphicsRootSignature(m_rootSignature); 

// set constant buffer view 
commandList->SetGraphicsRootConstantBufferView(0, m_constantBufferUploadHeaps[frameIndex]->GetGPUVirtualAddress()); 

const auto& meshes = data.model->getMeshes(); 
for (auto mesh : meshes) 
{ 
    if (auto materialHandle = mesh->material.lock()) // get material handle from weak ptr. 
    { 
     ID3D12DescriptorHeap * matDescriptorHeap = materialHandle->material.descriptorHeap; 

     // set the material descriptor heap 
     ID3D12DescriptorHeap* descriptorHeaps[] = { matDescriptorHeap }; 
     commandList->SetDescriptorHeaps(_countof(descriptorHeaps), descriptorHeaps); 

     // HERE ! set the descriptor table to the descriptor heap (parameter 1, as constant buffer root descriptor is parameter index 0) 
     commandList->SetGraphicsRootDescriptorTable(1, matDescriptorHeap->GetGPUDescriptorHandleForHeapStart()); 
    } 

    commandList->IASetVertexBuffers(0, 1, &mesh->vertexBuffer.bufferView); 
    commandList->IASetIndexBuffer(&mesh->indexBuffer.bufferView); 

    for (auto camera : data.cameras) 
    { 
     updateConstantBuffer(camera, frameIndex); 

     // Draw mesh. 
     commandList->DrawIndexedInstanced(mesh->nbIndices, 1, 0, 0, 0); 
    } 
} 

}

Qu'est-ce qui ne va pas?

Répondre

0

Trouvé une solution. La mise à jour de l'état des textures lorsqu'elle n'est pas utilisée l'a corrigé.

Ainsi, lorsque la liaison d'une texture:

commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(/*textureResource*/, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); 

Après utilisation, puis remis à zéro état:

commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(/*textureResource*/, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_COMMON)); 
+0

Vous ne devriez pas utiliser COMMON si vous pouvez l'éviter (même si je pense que vous pourriez dire que c'est un correction de bogue/pilote). Avez-vous déjà écrit sur la texture après le début de la journée? – cmaughan

+0

Merci pour l'avertissement. Je n'écris pas aux textures, je les lie seulement comme des ressources de pixel shader. – Cloyz