https://learn.microsoft.com/ko-kr/windows/win32/api/d3d11/nn-d3d11-id3d11resource
https://learn.microsoft.com/ko-kr/windows/win32/api/d3d11/nn-d3d11-id3d11view
위 문서에서 ID3D11Resource는 리소스에 대한 일반적인 작업을 제공한다고 하는데, 간단하게 리소스 원본을 가지고 있다고 생각해도 좋을 듯
다만 Rendering Pipeline은 ID3D11Resource에 직접 접근할 수 없고, View를 통해서 접근이 가능한데, 이는 View란 Resource가 Rendering Pipeline에서 어떠한 데이터로 보이게 할 것인가를 정의하는 것이라고 생각하면 될 듯
Shader에서 Rendering중 접근할 수 있는 View
정점, 인덱스, 상수 등 구조화되지 않은 정보를 저장하는 공간
Buffer를 제외한 리소스의 총칭이라 생각해도 좋을 듯
RenderTarget이 된 Texture는 출력과 bind되어있으므로 PostEffect를 수행할 수 없음
Rendering이 완료된 Texture에 PostEffect를 수행하기 위해 Main Texture가 아닌 Sub Texture에 1차적인 Rendering을 수행하는 작업
// RenderTarget용 Texture생성
D3D11_TEXTURE2D_DESC m_TexDesc;
m_TexDesc.Width = (UINT)Width;
m_TexDesc.Height = (UINT)Height;
m_TexDesc.MipLevels = 1;
m_TexDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
m_TexDesc.SampleDesc.Count = 1;
m_TexDesc.SampleDesc.Quality = 0;
m_TexDesc.Usage = D3D11_USAGE_DEFAULT;
m_TexDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
m_TexDesc.CPUAccessFlags = 0;
m_TexDesc.MiscFlags = 0;
m_TexDesc.ArraySize = 1;
// Texture와 용도에 따른 View 생성
pd3dDevice->CreateTexture2D(&m_TexDesc, NULL, m_pTexture.GetAddressOf());
pd3dDevice->CreateShaderResourceView(m_pTexture.Get(), NULL, m_pSRV.GetAddressOf());
pd3dDevice->CreateRenderTargetView(m_pTexture.Get(), NULL, m_pRenderTargetView.GetAddressOf());
// Depth-Stencil용 Texture 생성
Microsoft::WRL::ComPtr<ID3D11Texture2D> pDSTexture = nullptr;
D3D11_TEXTURE2D_DESC DescDepth;
DescDepth.Width = Width;
DescDepth.Height = Height;
DescDepth.MipLevels = 1;
DescDepth.ArraySize = 1;
DescDepth.Format = DXGI_FORMAT_R24G8_TYPELESS;
DescDepth.SampleDesc.Count = 1;
DescDepth.SampleDesc.Quality = 0;
DescDepth.Usage = D3D11_USAGE_DEFAULT;
DescDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
DescDepth.CPUAccessFlags = 0;
DescDepth.MiscFlags = 0;
pDevice->CreateTexture2D(&DescDepth, NULL, &pDSTexture);
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&dsvDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC));
ZeroMemory(&srvDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC));
dsvDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
srvDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
// 용도별 View 생성
srvDesc.Texture2D.MipLevels = 1;
pDevice->CreateShaderResourceView(pDSTexture.Get(), &srvDesc, &m_pDsvSRV);
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
pDevice->CreateDepthStencilView(pDSTexture.Get(), &dsvDesc, &m_pDepthStencilView);
m_pDepthStencilView->GetDesc(&m_DepthStencilDesc);
// Rendering 전 Texture 초기화
const FLOAT color[] = { vColor.x, vColor.y, vColor.z, vColor.w };
pContext->ClearRenderTargetView(m_pRenderTargetView.Get(), color);
pContext->ClearDepthStencilView(m_pDepthStencilView.Get(), D3D11_CLEAR_DEPTH, 1.0, 0);
pContext->ClearDepthStencilView(m_pDepthStencilView.Get(), D3D11_CLEAR_STENCIL, 1.0, 0);
// 임시 RenderTargetTexture 적용
pContext->OMSetRenderTargets(1, m_pRenderTargetView.GetAddressOf(), m_pDepthStencilView.Get());
pContext->RSSetViewports(1, &m_vp);
// Rendering
...
// 기존 RenderTarget으로 교체
pContext->RSSetViewports(m_nViewPorts, m_vpOld);
pContext->OMSetRenderTargets(1, &m_pOldRTV, m_pOldDSV);
// 화면을 가득 채우는 Screen Object에 Texture 적용-출력
m_pScreen->PreRender(m_pImmediateContext);
// 이미 Rendering된 Texture에 Shader를 통해 PostEffect를 적용 가능
m_pImmediateContext->PSSetShaderResources(0, 1, m_RT.m_pSRV.GetAddressOf());
m_pScreen->PostRender(m_pImmediateContext);
HLSL파일을 컴파일 시 CSO라는 Object파일 생성
ComplieFromMemory함수를 통해 접근이 가능한 듯
VS의 속성 설정을 통해 빌드에서 제외할 수 있음
Entry Point를 통해 시작 함수 변경 가능