相對於 opengl 的保存到FBO裏面 dx11 裏面需要用到 Render To Texture--RTT
渲染到紋理,顧名思義就是把渲染目標從幀緩存變成一個紋理。
這樣就可以把一個場景渲染後在進行Post Process,做出現在流行的各種特效。
另外在利用GPU做通用計算的時候程序也是通過RTT和GPU交換數據的。
一般情況下需要用以下方式來創建render target ,target對於的 pbackbuffer 就是對應着屏幕上渲染的部分
HRESULT result;
// CREATE RENDER TARGET VIEW
result = pSwapChain->GetBuffer(NULL, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&pBackBufferTex));
if (FAILED(result))
{
return false;
}
D3D11_TEXTURE2D_DESC BBDesc;
ZeroMemory(&BBDesc, sizeof(D3D11_TEXTURE2D_DESC));
pBackBufferTex->GetDesc(&BBDesc);
D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;
ZeroMemory(&RTVDesc, sizeof(D3D11_RENDER_TARGET_VIEW_DESC));
RTVDesc.Format = BBDesc.Format;
RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
//RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
RTVDesc.Texture2D.MipSlice = 0;
result = pDevice->CreateRenderTargetView(pBackBufferTex, &RTVDesc, &pRenderTargetView);
if (FAILED(result))
{
MyDebug(_T("ERROR"));
}
Memory::SafeRelease(pBackBufferTex);
在vr模式裏面,就需要代替這裏的render target 使用以下代碼 新建一個 target 對應的紋理 然後把紋理和target view 綁定到一起就可以
D3D11_TEXTURE2D_DESC textureDesc;
HRESULT result;
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
// Initialize the render target texture description.
ZeroMemory(&textureDesc, sizeof(textureDesc));
// Setup the render target texture description.
textureDesc.Width = textureWidth;
textureDesc.Height = textureHeight;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
// Create the render target texture.
result = device->CreateTexture2D(&textureDesc, NULL, &m_renderTargetTexture);
if(FAILED(result))
{
return false;
}
// Setup the description of the render target view.
renderTargetViewDesc.Format = textureDesc.Format;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;
// Create the render target view.
result = device->CreateRenderTargetView(m_renderTargetTexture, &renderTargetViewDesc, &m_renderTargetView);
if(FAILED(result))
{
return false;
}
其他的在繪製時注意切換 target view 模式就行
deviceContext->OMSetRenderTargets(1, &m_renderTargetView, depthStencilView);
dx11 版本的vive 的hellovr 實現