본문 바로가기

Graphics Note

유리같은 셰이딩

예제들에 나오는 환경맵에 대한 굴절은 실제 상황에서 적용하기 많이 힘들다.

다른 지오매트리들도 많은데 환경맵에 대해서만 굴절이 되니 적용할 만한 상황이 그렇게 많지가 않다.

굴절 유리가 필요해서 다른 많은 예제들(특히 pondwater)을 참고하여 만들었다.

 

'굴절' 이 주가 아니라 굴절을 하기 전 유리에 비친 상을 표현하는게 목적.

 

1. SetClipPlane 으로 클리핑 평면을 유리의 평면으로 변경시킴

 

2. RenderToSurface로 미리 만들어둔 텍스쳐의 Surface로 렌더 (텍스쳐는 D3DUSAGE_RENDERTARGET로)

 

3. 클리핑 평면을 되돌림

 

4. 생성된 텍스쳐를 셰이더에서 사용. 셰이더에서도 동차좌표계임을 고려해서 조작해야함

 

 

 

 

IDirect3DTexture9*            m_pTex;
ID3DXRenderToSurface*   m_pRTS;
IDirect3DSurface9*           m_pSuf;
D3DVIEWPORT9               m_vp;

 

// 표면은 2의 승수 크기로 만들어주는게 좋다.(무조건인진 잘 모르겠음..)

unsigned int rectSz = 512;

// 텍스쳐와 렌더투서피스 포멧, 사이즈 같아야함
D3DXCreateRenderToSurface(pDevice, rectSz, rectSz, D3DFMT_X8R8G8B8, true, D3DFMT_D24X8, &m_pRTS);


D3DXCreateTexture(pDevice, rectSz, rectSz, 0, D3DUSAGE_RENDERTARGET|D3DUSAGE_AUTOGENMIPMAP,

                D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &m_pTex);

m_pTex->GetSurfaceLevel(0, &m_pSuf);

m_vp.X = m_vp.Y = 0;
m_vp.Width = m_vp.Height = rectSz;
m_vp.MinZ = 0;
m_vp.MaxZ = 1;

 

 

pDevice->SetClipPlane(0, m_wallClipPlane);
pDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1);

m_pRTS->BeginScene(m_pSuf, &m_vp);
  // 여기서 오브젝트 드로우
m_pRTS->EndScene(D3DX_FILTER_NONE);

pDevice->SetClipPlane(0, m_wallClipPlane); //왜인지 모르겠지만 클리핑평면을 다시 셋 해줘야함(이유 아시는분..)
pDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 0);

 

//  그 후 이펙트를 이용해서 m_pTex를 그리면 끝

 

 

 

볼록유리를 표현하려고 했었는데 그냥 휘어진 유리쯤으로 보인다.

스낼의 법칙을 아는것과 이걸 이용해서 굴절을 구현하는거랑은 차원이 다르다는걸 느꼈다.

처음 생각할때만 해도 텍스쳐 디스토네이션만 주면 되는거 아냐? 했었는데 ㅎㅎ,, 사흘은 고생한듯

'Graphics Note' 카테고리의 다른 글

[Mathematics] quaternion(사원수)  (1) 2013.07.10
[Mathematics] matrices for transformation  (0) 2013.07.09
[Mathematics] complex number  (5) 2013.07.01
Directx DXUT Library build & include  (0) 2013.03.30
[OpenGL]Model from .ASE  (0) 2012.12.12