프로그래밍 2017.07.27 18:13

 

스크린 스페이스 데칼 적용

 

 

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

 

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

 

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

 

 

 

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

 

 

 

 

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

 

 

 

 

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

알파를 조절하였다

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

 

 

 

 

 

 

 

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

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

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

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

 

 

 

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

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

최종적으로 렌더링

 

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

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

 

 

 

 

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 += 0.5f;

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

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

 

 

 

 

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

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

 

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

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

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

 

 

 

 

알파를 조절하거나,

 

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

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

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

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

 

 

 

저작자 표시 비영리 변경 금지
신고
posted by 게임스타 게임스타

댓글을 달아 주세요

  1.  Addr  Edit/Del  Reply 학생

    안녕하세요 염치불구하고 궁금한게 있습니다..
    혹시 픽셀의 노말값중 가장 큰 값을 골라서 그축에 해당하는 uv로 만들어주실때 uv관련 코드에 써주신것중에 _vDecalDraw값은 무엇을 의미하나요?? 귀찮게 해서 죄송합니다..

    2017.11.02 12:15 신고
  2.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 게임스타 게임스타

    안녕하세요 ^^
    아무거나 물어보셔도 됩니다 ㅎㅎ
    _vDecalDraw 값은 x, y, z 값을 가진 값으로
    맵툴에서 강제적으로 축을 지정하고 싶을때, 사용하려고 추가한 값입니다
    (수동으로 축을 고정시키려구요, 맵툴에서 대충 이리저리 데칼이 이쁘게 나오게 조정할때
    사용했습니다 )
    뭔가를 계산한 값은 아니구요,
    대답이 되었는지 ㅎㅎ

    2017.11.02 17:36 신고
    •  Addr  Edit/Del 학생

      아! 감사합니다. 그 xz나 xy나 zy에 대해서 UV가 늘어지는 부분을 없애려구 노력중인데 픽셀의 노말값이 라이트, 업, 룩이 각각 제일 클때는 바닥이던 옆면이던 확실하게 잘 나오는데 벽이 약간 비스듬한 옆면이나 언덕같은 경우엔 짤려서 나오더라구요.. 이 부분을 해결하고 싶어서 DecalDraw에 대해 적용을 안시켜서 그런가 해서 여쭤봤는데 그건 아닌거같군요..

      2017.11.04 04:54 신고
  3.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 게임스타 게임스타

    오! 직접 구현 하시는 건가요!
    해결되면 저에게도 팁을 좀 알려주시면 감사 ^^
    화이팅 입니다!

    2017.11.04 12:48 신고