이제 어느 정도 렌더러 모습도 갖춰가기 시작해서 좀 있어보이게 하기 위해 셰이더쪽으로 이것저것 시도 해보고 있습니다. 범프맵도 적용해봤고, 그 다음 무엇을 해보까 하다가 오즈라엘님의 블로그를 보다 SSAO를 보고 와~ 나도 해보자 해서 이것저것 시도 해보려고 했는데, 그냥은 안되겠더군요. 그래서 그냥 으악~ 하고...

차근 차근 시작하자 해서 일단 지연 렌더링 ( Deferred Rendering, Deferred Shading )부터 구현해보자 해서 시작해봤습니다. 그러기 위해서 일단 MRT ( Multiple RenderTargets ) 를 구현!!

LPDIRECT3DSURFACE9 m_surfPos, m_surfNorm, m_surfDiff; // 서페이스
LPDIRECT3DTEXTURE9 m_texPos, m_texNorm, m_texDiff; // 텍스쳐

// MRT 갯수 체크
assert( m_D3DCaps.NumSimultaneousRTs > 3 );

// 텍스쳐 생성
m_pD3DDevice->CreateTexture( 1024, 768, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F,
							D3DPOOL_DEFAULT, &m_texDiff, NULL );
m_pD3DDevice->CreateTexture( 1024, 768, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F,
							D3DPOOL_DEFAULT, &m_texNorm, NULL );
m_pD3DDevice->CreateTexture( 1024, 768, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F,
							D3DPOOL_DEFAULT, &m_texPos, NULL );

// 텍스쳐 - 서페이스 연결
m_texDiff->GetSurfaceLevel( 0, &m_surfDiff );
m_texNorm->GetSurfaceLevel( 0, &m_surfNorm );
m_texPos->GetSurfaceLevel( 0, &m_surfPos );

// 셰이더에 텍스쳐 등록

// MRT 지정
m_pD3DDevice->SetRenderTarget( 0, m_surfDiff );
m_pD3DDevice->SetRenderTarget( 1, m_surfNorm );
m_pD3DDevice->SetRenderTarget( 2, m_surfPos );

// 지연 렌더링 ㄱㄱㅆ~

// 렌더링 후 기존 백버퍼로 복구
m_pD3DDevice->SetRenderTarget( 0, m_surfBackBuffer );
m_pD3DDevice->SetRenderTarget( 1, NULL );
m_pD3DDevice->SetRenderTarget( 2, NULL );

대략 위와 같은 분위기로 구현. 어쨋든 출력까지는 성공 했습니다.



다만, 기존 렌더러에 억지로 끼어넣는 바람에 화면이 겹치(?)는 현상이 좀 발생하고 있습니다. 이것은 차근 차근 수정해나가야 할 듯 합니다. 수정이 완료되면, 다음엔 Pre-Lighting 도 도전!!!!

+ Recent posts