簡體   English   中英

DX11將頂點緩沖區映射為WRL :: ComPtr

[英]DX11 Mapping vertex buffer as WRL::ComPtr

我在映射頂點緩沖區時遇到了麻煩。 當我這樣做時:

ID3D11Buffer* pD3DSingleVertexBuffer;
...
pD3DImmediateContext->Map(pD3DSingleVertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mappedSubresource);

一切正常,所有框架正常工作。 但是,當我做這樣的事情時:

Microsoft::WRL::ComPtr<ID3D11Buffer> pD3DSingleVertexBuffer;
...
pD3DImmediateContext->Map(pD3DSingleVertexBuffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mappedSubresource);

什么都沒有呈現,但是應用程序不會崩潰,也沒有任何錯誤。

你知道我在做什么錯嗎?

正如您所發現的那樣,盡管創建D3D中經常使用的單元素數組的經典方法是僅對單個元素使用address-of運算符,但它也通常用於將輸出參數傳遞給創建方法(例如CreateDevice(&device) ) 。 由於這是更常見的用法,尤其是在整個Win32 API表面的上下文中,因此ComPtr旨在安全地提供輸出參數語義,在返回其地址之前,先對所包含的對象進行Release()處理。

有兩種方法可以解決此問題。 首先是實際創建對象數組,例如ID3D11Buffer** ppBuffers[] = { pBuffer.Get() }; 第二種是利用ComPtr::GetAddressOf ,它返回包含對象的地址,而不更改其引用計數。 在后一種情況下,請注意不要在確實使用容器作為輸出參數的情況下使用此方法,否則會泄漏先前保存的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM