10.25

신승빈·2022년 10월 25일
0

KGCA 수업

목록 보기
56/128

ID3D11Resource, ID3D11View

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에서 어떠한 데이터로 보이게 할 것인가를 정의하는 것이라고 생각하면 될 듯

ID3D11ShaderResourceView : ID3D11View

Shader에서 Rendering중 접근할 수 있는 View

ID3D11Buffer : ID3D11Resource

정점, 인덱스, 상수 등 구조화되지 않은 정보를 저장하는 공간

ID3D11Texture2D : ID3D11Resource

Buffer를 제외한 리소스의 총칭이라 생각해도 좋을 듯

Reference : https://vsts2010.tistory.com/124
Reference : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sorkelf&logNo=40169749877

TextureRenderTarget

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);

Shader Compiler

HLSL파일을 컴파일 시 CSO라는 Object파일 생성
ComplieFromMemory함수를 통해 접근이 가능한 듯

VS의 속성 설정을 통해 빌드에서 제외할 수 있음

Entry Point를 통해 시작 함수 변경 가능

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글