10.18

신승빈·2022년 10월 18일
0

KGCA 수업

목록 보기
52/128

DepthStencilBuffer

Depth Buffer와 Stencil Buffer를 함께 사용

Depth Buffer

정규화된 깊이 정보를 저장하는 버퍼
Back Buffer의 Pixel마다 해당하는 z값 저장
기본적으로 Object의 z값이 작거나 같을 경우 갱신
자동적으로 Object를 Camera에 대하여 정렬한 효과

Painter Algorithm

나중에 칠하는 Object가 가장 위에 나오게 하는 방식

Stencil Buffer

백버퍼의 일부 영역을 차단하여 그려지지 않도록 하는 버퍼
거울, 그림자에서 사용 가능

절차

    HRESULT hr;
    // 0번 resize 등록, 버퍼 정보 가져오기
    D3D11_RENDER_TARGET_VIEW_DESC rtvd;
    m_pRTV->GetDesc(&rtvd);
    DXGI_SWAP_CHAIN_DESC scd;
    m_pSwapChain->GetDesc(&scd);

    // 1번 텍스처를 생성한다.
    ComPtr<ID3D11Texture2D>  pDSTexture;
    D3D11_TEXTURE2D_DESC td;
    ZeroMemory(&td, sizeof(td));
    td.Width= scd.BufferDesc.Width;
    td.Height= scd.BufferDesc.Height;
    // DepthStencil Buffer에는 mipmap이 필요 없음
    td.MipLevels=1;
    td.ArraySize=1;
    // Depth Buffer 24bit, Stencil Buffer 8bit
    td.Format = DXGI_FORMAT_R24G8_TYPELESS;
    // DepthStencil Buffer에는 1개의 버퍼 필요
    td.SampleDesc.Count=1;
    td.Usage = D3D11_USAGE_DEFAULT;    
    td.CPUAccessFlags=0;
    td.MiscFlags=0;
    td.BindFlags = D3D11_BIND_DEPTH_STENCIL;
    hr = m_pd3dDevice->CreateTexture2D(&td, NULL, pDSTexture.GetAddressOf());
    
    // 2번 깊이스텐실 뷰로 생성한다.
    D3D11_DEPTH_STENCIL_VIEW_DESC dtvd;
    ZeroMemory(&dtvd, sizeof(dtvd));
    // Texture의 R24G8과는 다른 설정
    dtvd.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
    dtvd.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
    hr=m_pd3dDevice->CreateDepthStencilView(pDSTexture.Get(), &dtvd, m_pDepthStencilView.GetAddressOf());
    
    // 3번 뷰 등록, 3번째 인수
    m_pImmediateContext->OMSetRenderTargets(1, m_pRTV.GetAddressOf(), m_pDepthStencilView.Get());
    
    // 4번 상태 객체 생성
        D3D11_DEPTH_STENCIL_DESC dsd;
    ZeroMemory(&dsd, sizeof(dsd));
    dsd.DepthEnable = TRUE;
    dsd.DepthWriteMask= D3D11_DEPTH_WRITE_MASK_ALL;
    dsd.DepthFunc= D3D11_COMPARISON_LESS_EQUAL;
   /* BOOL StencilEnable;
    UINT8 StencilReadMask;
    UINT8 StencilWriteMask;
    D3D11_DEPTH_STENCILOP_DESC FrontFace;
    D3D11_DEPTH_STENCILOP_DESC BackFace;*/
    hr=pd3dDevice->CreateDepthStencilState(&dsd, &g_pDefaultDepthStencil);
    dsd.DepthFunc = D3D11_COMPARISON_GREATER;
    hr = pd3dDevice->CreateDepthStencilState(&dsd, &g_pGreaterDepthStencil);

    // 5번 깊이스텐실 뷰 상태 객체 적용
	m_pImmediateContext->OMSetDepthStencilState(TDxState::g_pDefaultDepthStencil,
		0xff);
    
    // 6번 DepthStencilView 초기화(Frame)
    // Depth와 Stencil은 따로 초기화 가능
    m_pImmediateContext->ClearDepthStencilView(m_pDepthStencilView.Get(), D3D11_CLEAR_DEPTH| D3D11_CLEAR_STENCIL, 1.0f, 0);

Depth Stencil 상태 객체

Reference : https://wdmab1204.tistory.com/m/12
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글