由于我自己也遇到了这个问题,并发现之前的答案有点不够详细,所以我想给出一个更详细的解决方案,现在我已经让它正常工作了:
可以通过从内部消息队列中读取消息来获得DirectX11的所有API调用,在此我将引用 这里 中提供的API调用。
通过调用ID3D11InfoQueue::GetMessage访问内部消息队列,该方法需要传入消息索引并使用 D3D11_MESSAGE 结构体填充提供的缓冲区,该结构体包含所需信息(严重级别、类别、ID和文本)。
然而,当我尝试迭代这个缓冲区时,我发现该缓冲区为空(通过调用ID3D11InfoQueue::GetNumStoredMessages)这似乎是由于某些过滤器而发生的。为了使运行时实际上填充此缓冲区,我首先需要调用ID3D11InfoQueue::PushEmptyStorageFilter,它推送一个不过滤任何消息的过滤器:
//HANDLE_HRESULT is just a macro of mine to check for S_OK return value
HANDLE_HRESULT(debug_info_queue->PushEmptyStorageFilter());
这个过滤器是与Chuck Walbourn's答案中提到的博客文章讨论的部分(虽然该链接只将我重定向至主页面,实际的博客文章在这里)。但它不包含有关如何重定向消息的任何信息。
一旦生成了消息,您可以像这样迭代它们:
UINT64 message_count = debug_info_queue->GetNumStoredMessages();
for(UINT64 i = 0; i < message_count; i++){
SIZE_T message_size = 0;
debug_info_queue->GetMessage(i, nullptr, &message_size);
D3D11_MESSAGE* message = (D3D11_MESSAGE*) malloc(message_size);
HANDLE_HRESULT(debug_info_queue->GetMessage(i, message, &message_size));
printf("Directx11: %.*s", message->DescriptionByteLength, message->pDescription);
free(message);
}
debug_info_queue->ClearStoredMessages();
debug_info_queue是ID3D11InfoQueue接口,可以通过以下方式获取:
ID3D11InfoQueue* debug_info_queue
device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)&debug_info_queue)