깊이와 스텐실
후하후하..이번에 삽질좀 했군.ㅜㅜ.
기억하기.
깊이테스트든 스텐실 테스트든 결국 그리기의 여부를 판단하는 연산.
스텐실버퍼와 깊이버퍼는 물리적으로 하나의 버퍼를 나누어 사용한다.
// 깊이스텐실 텍스처를 생성함.
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 |