깊이와 스텐실

반응형


후하후하..이번에 삽질좀 했군.ㅜㅜ.

기억하기.
깊이테스트든 스텐실 테스트든 결국 그리기의 여부를 판단하는 연산.
스텐실버퍼와 깊이버퍼는 물리적으로 하나의 버퍼를 나누어 사용한다.

// 깊이스텐실 텍스처를 생성함.
 D3D10_TEXTURE2D_DESC descDepth;
 descDepth.Width    = scd->BufferDesc.Width;
 descDepth.Height   = scd->BufferDesc.Height;
 descDepth.MipLevels   = 1;
 descDepth.ArraySize   = 1;
 descDepth.Format   = DXGI_FORMAT_D24_UNORM_S8_UINT; //스텐실도 포함.
 descDepth.SampleDesc.Count = 1;
 descDepth.SampleDesc.Quality = 0;
 descDepth.Usage    = D3D10_USAGE_DEFAULT;
 descDepth.BindFlags   = D3D10_BIND_DEPTH_STENCIL;
 descDepth.CPUAccessFlags = 0;
 descDepth.MiscFlags   = 0;
 hr = (*device)->CreateTexture2D( &descDepth, NULL, depthStencil );
 if( FAILED(hr) )
  return false;

d3d10이 지원하는 스텐실버퍼의 포맷은 두가지이다.
DXGI_FORMAT_D24_UNORM_S8_UINT - 깊이스텐실버퍼에 32비트(픽셀당 깊이에 대해서 24비트, 스텐실 8비트)
DXGI_FORMAT_D32_FLOAT_S8X24_UINT - 깊이스텐실버퍼에 64비트(픽셀당 깊이에 32비트, 스텐실 8비트, 그외 24비트는 미사용)

스텐실버퍼를 사용하지 않고 깊이버퍼만 사용할 경우 DXGI_FORMAT_D32_FLOAT_S8X24_UINT를 사용


// 깊이스텐실뷰를 생성함.
 D3D10_DEPTH_STENCIL_VIEW_DESC dsvd;
 dsvd.Format = descDepth.Format;
 dsvd.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2D;
 dsvd.Texture2D.MipSlice = 0;
 hr = (*device)->CreateDepthStencilView( (*depthStencil), &dsvd, depthStencilView );
 if( FAILED(hr) )
  return false;

// 하나의 렌더타겟와 하나의 깊이스텐실뷰를 렌더타겟으로 지정.
(*device)->OMSetRenderTargets( 1, renderTargetView, (*depthStencilView) );

스텐실버퍼의 초기화는 깊이버퍼와 같이 이루어 진다.
device->ClearDepthStencilView(depthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL,1,0);

// 사용하기.
ID3D10Texture2D*   depthStencil  = NULL;
ID3D10DepthStencilView*  depthStencilView = NULL;

.fx
테크닉이 두개가 필요하다.
하나는 기본 메시를 렌더링 할 것.
하나는 스텐실버퍼의 값에따라 픽셀값을 달리하여 렌더링






perfhud를 일단 붙이긴 했는데 제대로했는지몰라..ㅡㅡ;.
출근시간이.다되어가서리..
IDXGIFactory *pDXGIFactory;
 ID3D10Device *pDevice;
 HRESULT hRes;
 hRes = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&pDXGIFactory);

 UINT nAdapter = 0;
 IDXGIAdapter* adapter = NULL;
 IDXGIAdapter* selectedAdapter = NULL;
 D3D10_DRIVER_TYPE driverType = D3D10_DRIVER_TYPE_HARDWARE;

 while (pDXGIFactory->EnumAdapters(nAdapter, &adapter) != DXGI_ERROR_NOT_FOUND)
 {
  if (adapter)
  {
   DXGI_ADAPTER_DESC adaptDesc;
   if (SUCCEEDED(adapter->GetDesc(&adaptDesc)))
   { const bool isPerfHUD = wcscmp(adaptDesc.Description, L"NVIDIA PerfHUD") == 0;

   // Select the first adapter in normal circumstances or the PerfHUD one if it exists.

   if(nAdapter == 0 || isPerfHUD)
    selectedAdapter = adapter;

   if(isPerfHUD)
    driverType = D3D10_DRIVER_TYPE_REFERENCE;
   }
  }
  ++nAdapter;
 }

'Study > Directx 10' 카테고리의 다른 글

shadow volume  (0) 2010.06.02
평면 그림자  (0) 2010.06.02
D3D10_SHADER Constants  (0) 2010.05.30
D3D10_BLEND_OP Enumeration  (0) 2010.05.30
D3D10_BLEND Enumeration  (0) 2010.05.30
TAGS.

Comments