프로그래밍 2017. 7. 27. 18:13
728x90

 

스크린 스페이스 데칼 적용

 

 

정적인 데칼과
동적인 데칼로 나누어서 작업

 

맵툴에서,
정적으로 데칼을 셋팅해 둘수도 있고, ( 맵 꾸미기 용 ),

 

게임에서,
동적으로 데칼을 생성할수도 있게 작업( 탄환 자국 )

 

 

 

기와집 중간벽쯤의 풀자국은 맵에서 셋팅해둔것

 

 

 

 

돌을 던진후에 맞은 위치 부근의 다이나믹 데칼

 

 

 

 

데칼의 외곽은 중점에서 멀어질수록, 스무드하게 사라지도록

알파를 조절하였다

이렇게 하면, 어떤 이미지를 사용하던지, 데칼은 둥그렇게 표현된다

 

 

 

 

 

 

 

현재는 데칼이 버섯에도 적용되는데,

이것은 뎁스값을 기록할때 예외적으로 처리해서,

버섯에는 적용되지 않도록 처리할수 있을듯,

(탄환 오브젝트의 경우에는 아예, 뎁스에 기록하지 않던지... )

 

 

 

데칼은 데칼끼리 모아서 그려주어야 한다

데칼이 붙을수 있는 모든 오브젝트들을 모두 그리고,

최종적으로 렌더링

 

이펙트를 드로우하는 요령으로 알파쓰기를 끄고 렌더링해주면,

겹쳤을때도 이쁘게 출력된다

 

 

 

 

UV 코드는

XZ, XY, ZY 세 개로 분류해서 사용

(게임 환경에 따라 달라질수 있는 부분이므로, 구현은 여러가지 방식으로 가능할듯)

 

나의 경우는, 픽셀의 노말값중,  xyz 값중 가장 큰값을 골라서, 그축에 해당하는 UV 로 출력

시켜 주었다,

 

위 스샷에 나와있듯이 UV가 늘어지는 부분이 생긴다

완벽하지는 않다,

 

체크값을 넣어서 값 이하이면, 잘라내는 식으로도 적용 가능하다

 

 

 

 

 

 

맵툴에서 미리 만들어 두는 경우에는

데칼 오브젝트를 적절하게 회전시키면, UV 를 깔끔하게 보이도록 조정할수 있으니,

구현에, 너무 고민하지는 말자

 

 

 

 

 

 

 

 

 

 

 

 

 

조금 연하게, 알파를 적절하게 사용하면,

UV 가 어긋나도 그렇게 티가 나지 않는듯 하다

 

그리고,

데칼 역시 노말매핑이 적용되도록 처리하는것이,

자연스럽게 보인다

 

데칼 오브젝트는

일반 오브젝트 렌더링에 추가적으로 flag 를 추가해서 사용하는 것이 편하다,

오브젝트를 그릴때 데칼 형식으로 그리던가, 일반적으로 그리던가,

뭐 여러가지 방식으로...

 

 

참고로, UV 관련 코드

PS() 에서,

 

float dist = 0.f;

//
if( 0 == (int)_vDecalDraw.x ) //일반적인 바닥땅(하늘을 바라보는 방향의 면)
{
      InUV = decalLocalpos.xz;
}
else
{  

      //vPixelDepth 은 픽셀의 노말값
      float3 vPixel = abs(vPixelDepth);
  
      if( vPixel.y > vPixel.x && vPixel.y > vPixel.z )
      {
           InUV = decalLocalpos.xz;
      }
      else if( vPixel.x > vPixel.z && vPixel.x > vPixel.y )
      {
           InUV = decalLocalpos.zy;    
      }
      else if( vPixel.z > vPixel.x && vPixel.z > vPixel.y )
      {
           InUV = decalLocalpos.xy;  
      }
      else
      {
           //discard;

           InUV = decalLocalpos.zy;

           -> 다시 이렇게 수정하였다, 여기서 무시하면, 데칼이 잘리는 경우가 생긴다

           -> 즉, 어떠한 경우던지 무시하지 말고, 적당한 축으로 그려주어보자
      }  
}

 

InUV += 0.5f;

//모든 축에 대한 반지름으로 계산 
dist = sqrt( decalLocalpos.x*decalLocalpos.x

+ decalLocalpos.y*decalLocalpos.y + decalLocalpos.z*decalLocalpos.z ); 

 

 

 

 

UV 관련해서, 조금더 고민하면,

깔끔하게 보일수 있는 솔루션을 찾을지도 모르겠다

 

맵에 놓는것은, 미리 오브젝트를 조절해서

(회전이나, 알파값 조절, 특정면 잘라내기)

이쁘게 보이도록 할수있으므로, 큰 고민은 되지 않는다

 

 

 

 

알파를 조절하거나,

 

땅바닥에만 decal이 붙도록 처리가 가능

dot ( (0,1,0), 픽셀노말 ) 값이 특정값보다 작으면 무시하도록 처리

(땅바닥면이 하늘을 향하므로 값이 1에 가까워 진다, 그러므로 작은 값은 무시하면,

땅바닥면만 그려줄수 있다)

 

 

 

728x90
posted by BK dddDang
: