반사

반응형

반사는.복잡하지만..평면반사는그다지.어렵지않다.
내부 내용은제꾸고.D2DXMatrixReflect함수를 쓰는게야.

 D3DXMATRIX T, R; // 반사행렬을 계산.
  D3DXPLANE  plane(0.0f, 0.0f, 1.0f, -5.0f);
  D3DXMatrixReflect(&R, &plane);
  matWorld = matObjWorld * R;

반사된 장면을 렌더링할때는 거울내부에만 그려지도록 해야 하는데 이를 위해
스텐실버퍼를 사용해야 한다.
- 일반 장면을 그린다.
- 스텐실버퍼를 0으로 초기화한다.
- 스텐실 버퍼에서 거울에 해당하는 픽셀들만 1의 값을 가지도록 한다. 
- 거울영역에 반사된 물체들을 그린다.

거울에 해당하는 삼각형을 렌더링할때는 스텐실버퍼만 변경되도록 지정해야 한다.
그릴때에 스텐실테스트가 항상성공하도록 하고 테스트가 성공하면 스텐실 버퍼값을 1로 지정한다.

거울 그리기
// 거울영역에 대해서만 스텐실값이 1이고 나머지는 모두 0으로 남아있도록 스텐실버퍼를 채운다.
DepthStencilState StencilSetToOne // z버퍼는 수정되지 않도록 한다.
{
 DepthEnable  = true;
 DepthWriteMask = Zero;   // 깊이값 쓰기 금지
 DepthFunc  = LESS_EQUAL; 
         
 StencilEnable = true;   // 스텐실 활성화 
 StencilReadMask = 0xFF;
 StencilWriteMask= 0xFF;
  
 FrontFaceStencilFunc = ALWAYS; // ref값(1)로 수정함 - 항상 스텐실테스트 성공.
 FrontFaceStencilPass = REPLACE;
 FrontFaceStencilFail = Keep;
 
 BackFaceStencilFunc = ALWAYS;
 BackFaceStencilPass = Keep;
 BackFaceStencilFail = Keep;
};

거울을 그리는 테크닉에서 SetDepthStencilState( StencilSetToOne, 0x1 );     를 지정한다.

// 후면버퍼의 내용이 수정되지 않도록 한다.
BlendState BlendMirrorStencil    // 그림자 볼륨은 스텐실버퍼만을 수정하므로 렌더타겟은 수정하지 않는다.
{
 AlphaToCoverageEnable = FALSE;
 BlendEnable[0]   = TRUE;
 SrcBlend = Zero;
 DestBlend = One;
 BlendOp  = ADD;
 SrcBlendAlpha = Zero;
 DestBlendAlpha = One;
 BlendOpAlpha = ADD;
 RenderTargetWriteMask[0]= 0xF; // write mask
};  

거울에 반사된 물체그리기.
// 거울에 반사된 물체는 전면이 아닌 후면이 보이도록 해야하므로 전면제거로 설정.
RasterizerState Culling
{
 CullMode = FRONT; 
 FillMode = SOLID;
 FrontCounterClockwise = false;
};

DepthStencilState StencilEqualOne // z버퍼는 수정되지 않도록 한다.
{
 DepthEnable  = true;
 DepthWriteMask = ALL;
 DepthFunc  = LESS_EQUAL; 
         
 StencilEnable = true;   // 스텐실 활성화 
 StencilReadMask = 0xFF;
 StencilWriteMask= 0xFF;
  
 FrontFaceStencilFunc = ALWAYS; // 전면은 무시
 FrontFaceStencilPass = Keep;
 FrontFaceStencilFail = Keep;
 
 BackFaceStencilFunc = Equal;  // 뒤집혀지도록 후면제거.
 BackFaceStencilPass = Keep;   // 성공후 값 유지
 BackFaceStencilFail = Keep;
};


BlendState BlendStencilObject   // 반사된 주전자를 거울에 블랜딩한다.
{
 AlphaToCoverageEnable = FALSE;
 BlendEnable[0]   = TRUE;
 SrcBlend = SRC_COLOR;
 DestBlend = ZERO;
 
 BlendOp  = ADD;
 RenderTargetWriteMask[0]= 0x0F; // write mask
};


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

듀얼모니터.. 빌어먹을 dxut  (0) 2010.06.13
IDXGIFactory::MakeWindowAssociation Method (Windows)  (0) 2010.06.05
shadow volume  (0) 2010.06.02
평면 그림자  (0) 2010.06.02
깊이와 스텐실  (0) 2010.06.01
TAGS.

Comments