반사
반사는.복잡하지만..평면반사는그다지.어렵지않다.
내부 내용은제꾸고.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 |