[英]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.