프로그래밍 2015. 6. 3. 19:39
728x90

 

특정 오브젝트만 bloom

 

또는 특정 오브젝트만을 distortion 해주고자 할때도 동일합니다.

 

적용하기 쉬운, 간단한 팁입니다.

 

 

맵에서 특정한 오브젝트 몇개만

bloom 을 적용하고 싶다면,

 

bloom 용 렌더타겟 텍스쳐를 만들어서,

여기에다가 오브젝트를 렌더링시키고,

 

bloom 용 렌더타겟 텍스쳐를

다른 렌더타겟에 블러x, 블러y

으로 렌더링 해주어서, 최종적인 이미지가 만들어 집니다.

 

이 이미지를 원본화면과 합성시키면 bloom 이 적용됩니다만,

문제가 하나 있습니다.

 

특정 오브젝트 몇개만을 뽑아서 그려준것이고,

렌더타겟 이미지 두장을 합치는 것이기 때문에,

최종 합성시 z-order 를 체크할수가 없습니다.

때문에,

깊이값에 상관없이 무조건 화면에 그려지게 됩니다.

(앞에 가려지는 오브젝트가 있어도 뚫고 나타나게 됩니다)

 

추가 비용없이,

z-order 를 그대로 살릴수 있는 방법이 있습니다.

 

그것은

z-buffer 를 clear() 하지 않는 것입니다.

 

void
stRShader::StartRT_Bloom()
{
     D3DDEVICE->GetRenderTarget( 0, &m_pOrigSurf );
     D3DDEVICE->GetDepthStencilSurface( &m_pOrigStencil );

     

zSurf pSurf = NULL;
m_pRTBloom->GetSurfaceLevel( 0, &pSurf );
D3DDEVICE->SetRenderTarget( 0, pSurf );
qRelease( pSurf ) //GetSurfaceLevel 사용후에 반드시....
 //D3DDEVICE->SetDepthStencilSurface( m_pSurfOrig );

 

//clear target buffer

      //D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER
     //z버퍼는 클리어하지 않는다,

     //렌더링되어 기록되어 있는 다른 오브젝트의 z값을 그대로 사용한다는것
     //이렇게해야, 앞에 있는 오브젝트들에게 가려진다

    
     D3DDEVICE->Clear( 0, NULL, D3DCLEAR_TARGET, QARGB(0,0,0,0), 1.f, 0 );
}

 

//bloom 시킬 오브젝트를 렌더링

//endRT

 

 

이렇게 했는데도,

어라,

깊이에 상관없이 화면에 그려지는 경우가 있습니다.

 

뭔가 잘못된 것일까요?

 

네, 그렇습니다. ^^

 

보통,

bloom 렌더타겟 텍스쳐는 (화면사이즈 / 2) 등으로 줄여서 사용합니다.

비용도 줄이고, 사이즈를 줄인만큼, 블러링을 많이 해주지 않아도,

텍스쳐 필터링 등을 통해서 bloom 영역이 늘어나게 되는 좋은 효과도 있습니다.

 

단, 주의할 점은

렌더타겟 텍스쳐 크기와 사용하는 깊이버퍼의 서페이스 크기는 같아야 한다는 것입니다.

이 크기가 다르면,

화면에서 오브젝트가 여기저기 잘리고, 이상한 현상이 생깁니다.

이것때문에, 제대로 z-order 가 적용되지 않습니다.

 

이 때는,

 

bloom 렌더타겟 이미지의 크기와

원본화면의 서페이스 크기( 또는 원본화면 렌더타겟의 크기)를

동일하게 맞추어 주시면,

깔끔하게 z-order 되는 bloom 영역을 보실수 있으실 겁니다.

 

 

 

 

728x90
posted by BK dddDang
: