直接x 12图像在英特尔图形上闪烁

时间:2017-05-20 19:27:38

标签: directx-12 direct3d12

我有一个奇怪的问题,只发生在我的英特尔高清显卡530上

渲染图像时,一些像素颜色随机变化。 见下图: Bug

对于有问题的像素,图形调试器显示从图形管道输出的颜色是正确的。但是像素显示的颜色是错误的。 请参阅:Debugger

根据我的调查,我发现这些像素似乎使用了其他像素的信息。我的材料信息由描述符堆处理。所以在我的渲染循环中图形根描述符表之间的切换似乎是我的问题(当我只绘制一个对象时一切都很好)

这里是我使用的代码片段:

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);
    }
}

}

怎么了?

1 个答案:

答案 0 :(得分:0)

找到解决方案。未使用时更新纹理状态修复它。

所以在绑定纹理时:

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

使用后再重置状态:

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