씬 머지 기능은 매우 유용한 기능입니다 

씬 머지 기능을 이용하면, 한 씬을 여러 씬으로 나눌 수 있기 때문에 여러 명이 작업할때에도 유용하고 

관리적인 측면에서도 편리하기 때문입니다. 또한 동적 로딩까지 가능하기 때문에 응용하기도 좋습니다. 


그렇지만, 여기에서의 한계점에 대해 생각해 볼 필요가 있습니다. 


예를 들어 라이트맵과 같은 씬 전체의 환경과 연관있는 것들까지 아무 문제 없이 합쳐지는가...?


그래서 테스트를 좀 해봤습니다 


테스트한 항목은


Lightmap (Substractive only)

Reflection probe

Light probe


3가지 항목입니다. 




일단 씬 A 입니다. 3가지 항목을 모두 Baked 한 상태입니다 Bake한 라이팅은 꺼놨습니다 





그리고 씬 B입니다. 역시 3가지 항목을 모두 Baked 한 상태입니다. 라이트는 꺼놨습니다 





그리고 두 scene을 add 해 봤습니다. 이럴수가! , 원래 있던 Lightprobe가 사라졌습니다. 

다른 것들은 모두 제대로 있습니다. Lightmap도 정상이고 Reflection probe도 정상입니다 




선택해보면 뭔가 흔적은 있어 보입니다만, 둘이 애매하게 합쳐져 있습니다. 둘이 독립적으로 존재할거라고 생각했었는데 말입니다 




실제 Dynamic Object를 넣어보면, 이상하게 동작합니다. A의 Probe는 없는듯 ... 


다른것들은 모두 제대로 동작하는데 유일하게 Light Probe만 제대로 merge되지 않습니다. 



문제는 이게 좀 심각하단 거죠. 

scene merge 기능을 사용할때 라이트 프로브를 사용 못한다는건, 라이트맵이나 리플렉션 프로브는 제대로 넘어오는것에 대한 의미가 엄청나게 축소되어 버립니다. 실제 사용할때 참 곤란하겠군요. 


https://forum.unity.com/threads/how-to-add-update-light-probes-when-using-load-additive.394508/


이미 예전부터 문제가 보고되고 있었습니다만, 전혀 해결되지 않고 있었습니다. 해결이 어려운건 아닐 것 같은데.. 


다음 버전에서는 개선되길 바랍니다


"Particles/Standard Unlit"




사실상 가장 제대로 쓸 것 같은 이펙트용 쉐이더입니다 

기존 쉐이더와 그나마 가장 비슷하게 쓸 수 있으니까요 

역시 Vertex Streams 연결을 해 줘야 합니다. Apply to System을 눌러주세요 



아무래도 조명 연산이 없다보니 그냥 스텐다드보다는 좀 더 가볍고, 조절할 수 있는 옵션들은 기존 쉐이더에 비해 늘어났습니다 

'새로 생긴 이펙트용 쉐이더' 를 추천하라면 이녀석을 추천하겠네요 


근데 이녀석은 좀 재밌어졌달까 귀찮아졌달까... 조합이 더 생겼어요 

ColorMode라는게 생겨서 말입니다. 

이게 설명이 좀 필요하고 렌더링 모드와 조합이 좀 필요해요

사실상 이 둘을 완벽하게 이해하고 써야 제대로 된 결과물이 나오는데, 조합까지 들어가니까 귀찮아 집니다 

이게 이 쉐이더의 가장 중요한 옵션이예요 

그래서 뭐 대충 설명을 .. 



Blending Option


Rendering Mode


'이펙트 결과물과 배경과의 블렌딩' 옵션입니다. 

옵션은 이 문서 3번의 옵션과 동일합니다 여길 참고해 주시길


Color Mode

이게 좀 특이한거라 코드를 뜯어봤는데요, 결론적으로 얘기하면 '알베도와 버텍스 칼라와의 연산'
'알베도와 파티클 칼라와의 연산'[각주:1] 입니다 


이 녀석과 


이 녀석과의 색상연산 결과예요. 렌더링 모드보다는 이전에 계산됩니다. 

아마도 Color over lifetime과도 같이 연산이 되겠죠. 그녀석도 버텍스 칼라니까. 


Color Mode의 옵션은 설명할 필요가 있으니 설명해 봅니다 

....사실 뭐 포토샵과 같긴 해요 -_- 

알파는 생각하지 않고 RGB만 생각하면 되며, 포토샵의 레이어 블렌딩 옵션과 동일하게 움직입니다 

단, 아래 설명은 Blend Mode를 Opaque에서 설명하였습니다. 

그 녀석이 가장 원래 텍스쳐를 잘 보여주니까요 



Multiply 

곱하기입니다. 뭔가 어두워질거라 생각될 수도 있지만, 파티클 칼라를 흰색으로 하면 알베도 색이 그냥 나오고 

파티클 칼라를 검은색으로 하면 검은색이 나옵니다. 

두 색을 곱하면 어두워지니까요. 





Additive 

더하기입니다. 뭐 아시겠죠 

파티클 칼라가 흰색이면 흰색으로 나오고 검은색은 알베도 색이 나옵니다 


Subtractive 

빼기입니다. 

알베도 - 파티클 칼라 공식이지요 

그래서 파티클 칼라가 흰색이면 검은색으로 나오고 검은색이면 원래 알베도 색상이 나옵니다 


Overlay 

오버레이 공식은 회색(0.5)을 기반으로 밝은 색과 어두운 색의 연산이 다릅니다 

파티클 칼라가 흰색이면 좀 더 밝아지는 느낌이 납니다. 검은색이면 중간 아래 부분은 심하게 어두워지고 반대는 강렬해집니다 



Color

포토샵의 Color와 동일하게 동작합니다. 

알베도 칼라를 파티클 칼라의 채도로 대체합니다 

파티클 칼라가 흰 색이나 검은색이면 희게 나오고,

특정 칼라라면 파티클 칼라의 색으로 나오게 됩니다 알베도의 검은색은 영향을 받지 않습니다 

명도변화없이 색만 수정하고 싶을때 쓰면 됩니다 



Difference 

역시 포토샵의 Difference와 동일하게 움직입니다. 

파티클 칼라가 흰 색인 경우 알베도의 칼라를 뒤집어 버리며, 

검은 색일 경우 알베도가 그대로 나오게 됩니다 


사실 설명이 이렇게 해서 잘 안될 것 같긴 한데, 그저 포토샵의 블렌딩 옵션하고 같다고 생각하시면 됩니다 


Main Options 


여기의 옵션도 3부와 동일합니다 

3부 내용을 참고해 주시길 

Distortion을 켜면 노말맵 입력이 나온다는 것 정도만 다릅니다 

나머지는 역시 3부와 동일하므로 삭제. 




"Particles/VertexLit Blended" 


이 쉐이더 역시 초창기부터 있던 쉐이더입니다. 

버텍스 라이팅이므로 조명을 받을 수 있는 가장 가벼운 쉐이더중 하나이며, [각주:2]

픽셀 연산이 아니기 때문에 노말맵은 사용불가, 그림자 사용 불가의 특징을 가지고 있습니다. 

그냥 빛 근처에서 밝아지는게 전부.. 


그 외에는 그냥 알파 블렌딩이랑 같다고 생각하시면 됩니다 



  1. 파티클 칼라는 버텍스칼라입니다 [본문으로]
  2. SH 라이트를 제외하고는 [본문으로]

#elif defined(_COLORADDSUBDIFF_ON)

#define fragColorMode(i) \

    albedo.rgb = albedo.rgb + i.color.rgb * _ColorAddSubDiff.x; \

    albedo.rgb = lerp(albedo.rgb, abs(albedo.rgb), _ColorAddSubDiff.y); \

    albedo.a *= i.color.a;


add모드일때 

 material.SetVector("_ColorAddSubDiff", new Vector4(1.0f, 0.0f, 0.0f, 0.0f));


Subtractive 모드일때 

material.SetVector("_ColorAddSubDiff", new Vector4(-1.0f, 0.0f, 0.0f, 0.0f));


Difference 모드일때

material.SetVector("_ColorAddSubDiff", new Vector4(-1.0f, 1.0f, 0.0f, 0.0f));


이므로 


add 모드일때 

  albedo.rgb = albedo.rgb + i.color.rgb * 1; \

  albedo.rgb = lerp(albedo.rgb, abs(albedo.rgb), 0); \

  albedo.a *= i.color.a;



Subtractive 모드일때 

  albedo.rgb = albedo.rgb + i.color.rgb * -1; \

  albedo.rgb = lerp(albedo.rgb, abs(albedo.rgb), 0); \

  albedo.a *= i.color.a;



Difference 모드일때 

  albedo.rgb = albedo.rgb + i.color.rgb * -1; \

  albedo.rgb = lerp(albedo.rgb, abs(albedo.rgb), 1); \

  albedo.a *= i.color.a;




"Particles/Standard Surface"


파티클에서 쓸 수 있는 스텐다드 쉐이더입니다. 

뭐 실제 써 보니까 굳이 파티클에만 쓸 수 있는건 아니구만요 


그렇지만 파티클에서 사용하기 좋은 유용한 기능들이 들어 있어서 파티클에 쓰기 괜찮은 녀석입니다. 

뭐 괜찮다고는 하지만 기본적으로 PBR이 돌아가는 스텐다드 쉐이더입니다. 가벼울리는 없지요 

그저 파티클에 쓸 필요가 있을때 쓸 수 있는 녀석이라는 거지 가볍다고 한 적은 없습니다 



어떨 때 씁니까?


일단 빛을 받아야 할 때 씁니다. 


메쉬로 된 파티클이나, 뭔가 노말맵을 쓰고 smoothness를 써서 빛에 반응해야 할 녀석을 만들 때 쓸 수 있습니다. 핏자국 같은 것도 쓸 수 있겠네요 


물론 그럼 '그냥 스텐다드 쉐이더를 쓰면 되지 않느냐! ' 라고 하실 수 있는데 

뭐 사실 맞습니다 그래도 되지요 


그렇지만 몇 가지 다른 점이 있습니다. 


일단 몇 가지 최적화가 되어 있고 버텍스 스트림 연결 메뉴가 있습니다. 

버텍스 스트림은 파티클에서 쉐이더를 직접 컨트롤 가능하게 연결해주는 것 같은거라고 생각하시면 편한데요 

이걸 파티클 시스템과 맞춰 주시는걸 먼저 해야 작동합니다. 

원래는 쉐이더 짤 때 파티클 시스템과 맞춰야 하는 전문적인 작업입니다만, 

Apply to Systems를 눌러 주시면 자동으로 맞춰 줍니다. [각주:1] 적용하면 먼저 누르고 시작하는게 좋습니다 


Rendering Mode 


Opaque : 일반적인 불투명 모드입니다. 알파 채널이 적용되지 않으며, 돌 같은 메쉬 파티클에 쓸 때 좋습니다. 


Cutout : 알파 테스팅 모드입니다. 반투명이 아닌 확실하게 알파 부분이 '잘라진' 느낌입니다. 뭔가 나뭇잎이나 찢어진 깃발, 혈흔 같은것처럼 확실하게 경계선이 구분되는 알파를 가진 물체용으로 좋습니다. 



Fade : 알파 블렌딩입니다 알파에 의해 부드러운 경계를 가진 물체를 표현하기 좋습니다. [각주:2]


Transparent : 알파 블렌딩입니다만, smoothness 등의 옵션은 알파에 의해 제거되지 않습니다. 반사는 되는데 투명한, 즉 유리 같은 느낌이라고 생각하시면 편합니다. 


Additive : 흔히 아는 밝아지는 모드입니다 그냥 쓰면 됩니다 



Subtractive : 빼기 모드입니다. 인버트에 가까운 결과가 나옵니다. 


Modulate : Multiply 모드와 같게 동작합니다만, 흰 부분이 투명해지진 않을겁니다. 이유는 이 쉐이더가 조명을 받기 때문인데, 환경광까지 받으면서 결과가 전혀 예상과 다르게 나옵니다. 연구가 좀 더 필요하긴 하겠지만, 이 상태로 Multiply 모드처럼 사용하기는 쉽지 않을 듯 합니다. 기울이면 Fresnel까지 나오거든요 이 쉐이더는 일단 전부 빛 계산이 들어간다는것을 잊으면 안됩니다. 

아무래도 일반 파티클처럼 쓰기에는 좀 무리가 있는듯. 빛을 받는 메쉬파티클용이라는 느낌이 강하게 납니다. 





Main Option 


Flip-Book Mode 

플립북 모드입니다. simple과 blended 가 있습니다. 



이 두 개는 재미있는게 위에서 설명한 버텍스 스트림 연결을 하지 않으면 동작하지 않습니다 

아니 정확히는 Simple모드로밖에 동작하지 않습니다. 

쉐이더와 파티클의 기능을 연결하는 것이기 때문이지요 


연결을 하고 나면 파티클의 Texture sheet Animation 기능이 이렇게 작동됩니다 

 

Simple Mode   Blended Mode     



Two Sided 

말그대로 2side 모드입니다 일반적인 cull off와 동일하게 동작함. 양면 렌더링이 됩니다. 


Enable Soft Particles 

소프트 파티클 모드입니다. 말그대로. 

여기서 이 기능을 포함한 몇몇 옵션은 Opaque나 Cutout 모드에서는 발동되지 않습니다. 


반투명이 필요한 옵션이라서. 




soft particle unity에 대한 이미지 검색결과

http://blog.wolfire.com/2010/04/Soft-Particles



Enable Camera Fading 


이펙트가 카메라에 가까이 가면 사라지는 옵션입니다 




Enable Distortion

디스토션 기능이 발동됩니다. Grabpass{}를 가동시켜 뒤 이미지를 구깁니다 

NormalMap 에 텍스쳐가 들어 있어야 하고, 

Strength로 강도를 조절하고 

Blend로 투명하게 합니다. 




Maps


그 외의 텍스쳐 옵션은 기본 Standard Shader와 동일합니다. 

물론 훨씬 기능은 축약되어 있습니다 

AO도 없고 UV 타일링 기능 같은것도 없습니다 










  1. 그런데 가끔씩 이걸 누르면 파티클 쪽에 에러가 나오던데, 이럴 때는 해당되는 에러메뉴의 텍스쳐를 미리 적용시켜서 다시 어플라이를 누르면 됩니다. 왠지는 대충 짐작가지만 참으로 귀찮네요. 물론 한두개 빠져도 동작은 잘 됩니다 [본문으로]
  2. 아래는 그림자를 켠 모습입니다. 파티클 옵션에서 끌 수 있습니다 [본문으로]

"Particles/Alpha Blended Premultiply"


기본적으로 알파 블렌딩 쉐이더입니다. 똑같이 동작하죠 

역시 알파가 있어야 하고 겹쳐져도 밝아지거나 어두워지는게 없습니다 .

그렇지만 외각의 검은 부분을 없애줍니다.

아래 그림처럼 검은 배경에 그린 이펙트 '일 때만' 의미있습니다. 아니라면 나가리.

 

Blend One OneMinusSrcAlpha

블렌딩을 쓰기 때문인데요. Additive 의 soft와 같은 구조입니다. 


때문에 이런 이미지로 알파 블렌딩 쉐이더를 만들때 


이렇게 나오던 것이 


이렇게 나오게 됩니다. 

단, 검은색 배경 이미지일때만 효과가 있다는 것은 말했고, 그 때문에  검은색이 빠지면서 좀 밝아 보이는건 어쩔 수 없긴 합니다. 


"Particles/Anim Alpha Blended" 


커스텀 버텍스 스트림 예제를 위한 파티클 쉐이더입니다. 기본적으로 알파 블렌딩 쉐이더입니다 

간단하게 텍스쳐 두 장을 변환 - 정확히는 한 장에 UV만 다른 - 하는 기능을 가진 쉐이더인데, 어디다 쓸지는 아직 잘 모르겠습니다. 주변에 쓴다는 말도 못들었고.. 파티클 버텍스 스트림과 같이 쓰지 않으면 별 소용 없는 쉐이더입니다 


"Particles/Multiply"


Blend Zero SrcColor로, 흔히 알고 있는 멀티플라이, 즉 어둡게 되는 이펙트입니다 

사실 알파 안써도 됩니다. 흰 부분에 가까울수록 투명해 지거든요 


 


그럼 그렇다고 알파 연산이 없느냐 하면 그건 또 아닙니다 알파 연산도 충실히 들어가 있습니다. 

하지만 굳이 알파 연산을 안해도 충분하기 때문에 일부러 알파 연산을 넣는다는 것 자체가 좀 에러죠

별 것 아니지만 이런 것 때문에 이펙트 아티스트들은 기본 내장 프리셋 쉐이더를 쓸 때 조금 꺼림직해 합니다 .



"Particles/Multiply (Double)"


기본적으로 멀티플라이 쉐이더가 맞긴 한데, 

Blend DstColor SrcColor

를 사용하기 때문에 

멀티플라이 블렌딩된 결과물을 정말 아무 생각없이 배경까지 같이 곱한것을 + 2 합니다. 

묘한 느낌이죠. 칼라일 경우 컴컴해지지 않고 칼라가 진해지는 느낌을 줄 수 있습니다만

어설픈 회색은 오히려 밝아지는 경우까지 일어날 수 있어서 사용하기 까다로운 녀석입니다. 

알파 연산은 '계산은 합니다만 그걸 RGB에 연산하지 A 에 연산하는건 아닙니다' 라는 스타일로 되어 있어서 애매합니다. 

없어도 된다 쪽이죠 이런건. 

솔직히 사용하기 좀 까다로운 놈입니다 공식은 알겠지만 ... 

 



"Particles/Priority Additive"

"Particles/Priority Additive(soft)"

"Particles/Priority Alpha Blend"


왠 Priority? 난데없이 생겨난 녀석들입니다. 우선순위?


이미 위에 있는것과 동일한 녀석이 우선순위라는 이름을 붙이고 존재한단 말이죠 


뭐야 갑자기?


그래서 뒤져봤더니 내장 쉐이더 코드가 공개되어 있지 않아??? 

나온지 얼마 안되었다는 말이군??


그래서 구글링과 함께 그냥 써 본 바에 의하면...


이 세 개는 기존의 3개와 같은 놈으로 보입니다. 

근데 다른 점이라면 이거 

  


렌더큐 3001번 ... 


히이이익



아니 잠깐, 이걸 독립시켰다고요?

렌더큐를 늦게 그린다는건 최상위에 그린다는 말이고, 이건 즉 다른 쉐이더들보다 위로 올라오겠다는 말인데 

그거라면 


그냥 예전 쉐이더에다가 렌더큐만 3001번으로 바꾸면 똑같잖아요 

근데 이걸 독립시켰다고??? 왜????? 어째서????

내장 코드를 못봐서 뭔가 다를게 있을지도 모르겠지만 일단 그럴거면 이름을 저렇게 짓는 것도 웃기고... 사용방법도 똑같고...

하여간 나중에 공개되면 분석해 보겠지만 지금은 왜... 라는 느낌이네요 




한동안 다른 공부좀 하느라고 블로그 업데이트를 전혀 못했었습니다. 다른 공부라면 우후후... 쉿


하여간 유니티 파티클에 파티클 셰이더들이 좀 업데이트 된 것 같은데 이게 또 설명이 없단 말이죠 (일해라 유니티!) 

뭐 사실 이펙트 아티스트 분들이 별로 관심 안가진 이유가 당연하게도 '어차피 이펙터들은 쉐이더를 만들어서 쓰니까' 였습니다 


맞아요... 쉐이더는 만들어 써야 합니다. 

특히 이펙트용 쉐이더는 더더욱 말이죠


일단 유니티는 재밌는게 '아티스트가 쉐이더를 만든다' 라는걸 배제시켜놓고 시작을 했어요

그래서 '쓸 법한 쉐이더를 잔뜩 미리 만들어 놓고 골라서 쓰게 한다' 라는 프리셋 정책을 시행하고 있지요 



이렇게 여러 종류의 프리셋을 만들어 두는 이유를 솔직히 모르겠어요. 외우기만 힘들지 사실 별 것도 아닌데.


그런데 언리얼은 '그런 거 없다' 는 정책입니다. 

'쉐이더를 노드로 짤 수 있게 해줄테니 아티스트가 다 짜라' 라는 거지요 

그래서 프리셋따위는 없습니다. 예제가 있긴 하지만. 


장단점이 있긴 하지만, 큰 의미에서는 언리얼쪽이 맞다라고 생각하긴 합니다. (사실 궁극적으로는 중간을 선택해야 한다고 봅니다만) 

쉐이더를 프리셋으로 만들어 놓으면, 몇 가지 문제가 생깁니다 

1. 왠지도 모르고 아무거나 쓴다 

2. 아예 모르는건 안쓴다


어쨌건  누구나 다 쉐이더를 짤 수 있는건 아니고

유니티는 프리셋을 만들어 놨으니까 간단하게 이펙트용 프리셋 쉐이더를 소개해 봅지요 다른 쉐이더는 메뉴얼에 살짝 언급이라도 되어 있는데 이펙트용은 아예 없어서 말이죠!  


사실 전통적으로는 - 특별히 쉐이더를 짤 수도 없고 짤 필요도 없는 환경이라면 - 이중에서 딱 3개만 쓰면 됩니다. 


Additive 밝게

Multiply 어둡게

Alpha Blended 알파 뚫리게


이렇게 말이죠 


요게 순서적으로 언리얼의 블렌드 모드로는

 


Additive 

Modulate

Translucent

와 동일하다고 생각하시면 편합니다. 


사실 여태까지 저렇게 쓰고 있던게 맞고요. 대부분의 책이나 강좌에서도 저거 세 개만 말합니다. 

여기서 말하는건... '그럼 나머지는 뭐냐' 라는 겁니다. 

2017인지 18인지부터 파티클에 난데없이 Standard Surface가 생기질 않았나 .. Standard Unlit도 생기고 말이죠 

궁금하잖아요. 뭔가 새로운 기술이 있을지 


그래서 한 번 소개해 봅니다. 


별 필요 없으신 분들은 위에 말한 3 개만 써도 되어요. 



그럼 일단 소개를 하나씩.. 


"Particles/~Additive-Multiply"


이건 뭘까. Add와 Multi가 같이 있다니...

블렌딩은 

Blend One OneMinusSrcAlpha

서피스 계산은 

col.rgb = _TintColor.rgb * tex.rgb * i.color.rgb * 2.0f;

col.a = (1 - tex.a) * (_TintColor.a * i.color.a * 2.0f);

인게 특징인 놈입니다 


이 녀석은 재미있게도 ADD와 Multi가 같이 가능한 녀석이지요 

아래 그림처럼된 텍스쳐를 넣는다면 


제어는 TintColor로 합니다. 


파티클용 쉐이더가 다 그렇듯 기본색은 회색인데, Tint 칼라 설정의 알파의 위치에 따라 ADD 쉐이더가 되기도 하고 Multi 쉐이더가 되기도 합니다. 

즉 이 쉐이더를 사용하기 위해서는 알파 채널이 반드시 있어야 합니다 


사실 Mulit 쉐이더 구문은 원래 사용하는 Multi와 느낌이 다릅니다만 그저 '같이 된다' 라는데 의의가 있는 듯 합니다. 

꽤 특이할 때만 쓸 수 있겠군요 







"Particles/Additive"


평범한 ADD 쉐이더입니다

블렌딩은 Blend SrcAlpha One 이라서

텍스쳐에 알파가 계산이 되기는 하지만 사실상 전혀 필요없고, (물론 결과물은 알파가 있고 없고에 따라 약간 차이가 납니다) 

텍스쳐의 RGB가 검은색이면 투명해질 뿐입니다 

사용방법이 매우 쉽고 많이 사용됩니다 



"Particles/Additive (Soft)"


ADD와 동일합니다만, ADD의 블렌딩은 

Blend SrcAlpha One

인데 비해 이 녀석은 

Blend One OneMinusSrcColor

입니다 


덕분에 소스에 알파를 곱하고 배경에 더하는게 아니라,

소스는 그대로 두고 배경에 소스의 칼라를 뒤집은 것을 곱합니다. 

그래서 결과적으로 좀 소프트한 결과물이 나오게 됩니다...만 사실 실제 쓰다 보면 차이를 느끼기 쉽지 않을겁니다. 

이 쉐이더 역시 알파가 필요 없습니다만 계산이 되긴 됩니다. 


"Particles/Alpha Blended"


알파가 반드시 필요한 쉐이더이며, 절대적으로 텍스쳐의 알파값에 따라 블렌딩 되는 정도가 변합니다. 

겹쳤을때 밝아 지거나 어두워지거나 하지 않고 그냥 자기 색이 나옵니다. 



나머지는 이어서.. 



강의중에 갑자기 SSR이 안보이는 사태가 발생해서 당황 .... (...)


그래서 집에서 이게 무슨 일인가 연구해봤습니다. 


일단 정상적인 상황. 




보통 SSR을 이렇게 선명하게 쓰진 않죠. 문제점이 확 드러나니까. 

그래도 공 말고 복잡한 오브젝트는 잘 못느끼긴 합니다. 


어쨌거나 이렇게 리플렉션 프로브와 SSR은 같이 잘 동작해야 정상입니다. 


그런데 이게 잘 안나오는 상황이 발견되었지요. 강의때 당황... 


뭐 원인분석은 본사에서 알아서 하라고 그러고 안나오는 상황만 말하자면...


라이트는 Mixed에서만 현상이 발견됩니다. 

Realtime이나 Baked에서는 보이지 않아요 



그리고 오브젝트는 static 이건 dynamic이건 상관 없구요 (당연하겠지만) 



거기에다가 라이트맵을 subtractive로 구웠을 경우에만 발생합니다.  이게 또 Baked Indirect나 ShadowMask로 구우면 안일어나요 



이게 뭐 사실 이 녀석들하고 연관될만한 녀석이 없잖아요? 후처리인데. 

이건 버그라고밖에 말할 수 없을듯 







현재 테스트한 버전은 2018.1.3f1 버전이고, 

SSR은 어셋 스토어에 올라와 있는 Post Process Stock V1 입니다 



그래서 이게 참 거시기한게, 

2018은  Post Process Stock V2 를 기반으로 만들어지고 있어서 V1은 호환성면에서 완벽하다는 보장을 할 수 없다는 느낌이지요 

실제로 V2로 2018에서 테스트 해 보면 , 잘 됩니다 -_- [각주:1]




근데 잘 된다고는 하지만, v1과는 또 전혀 다른 모양으로 동작합니다. 알고리즘 자체가 다른 느낌. 세부 옵션도 상당히 다르고 말이죠. 

아직 개발중인 느낌이 굉장히 나기도 합니다. 







하여간 그래서 이렇게, 

2018에서 Post Process Stack V1 을 사용할때 

Mixed light + Subtractive로 Baking 하면 

SSR이 나오지 않게 됩니다. 


SSR이 Deferred Rendering 전용이므로 Deferred인건 당연하고요. 


유니티가 SRP를 만들면서 이전 렌더링을 개선하지 않기로 했다고 하니까 아마 이 버그도 안고쳐질 가능성이 큰듯 하네요 


이 버그(?) 는 단지 이 경우에만 생깁니다. 

테스트 결과, 


2017 + Post Process Stock V1 의 SSR은 문제가 생기지 않았고 

2018 + Post Process Stock V2 의 SSR도 문제가 생기지 않았고 


2018 + Post Process Stock V1 의 SSR만 문제가 생깁니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ









  1. 심지어 그 며칠사이에 V2는 인터페이스도 바뀌었어요 ... [본문으로]

신형 progressive lightmapper테스트 중인데 

확실히 이전의 Enlighten보다는 좀 더 신용성 있게? 안정은 아닌것 같고 뭐라고 해야 하나 

하여간 좀 더 믿음직하게 움직인다 


그렇다곤 해도 

조금만 한계치를 올리면 생기는 저 노이즈는 바로 어쩔 수 없이 드러난다. 

샘플링 수치를 올리면 되겠지만 그러면 이번엔 베이킹 시간이 문제 




어쨌거나, 라이트맵의 안정성은 확실히 증가한 느낌이다. 다루기 편해지고 믿음직해졌음.

저 퀄리티일때에는 인라이튼 대비 확실히 빨라진 느낌이고, 고 옵션일 때에는 오래 걸리지만 

적어도 특정 구간에서 멈춘듯 오래 기다리는 문제는 일단 안보인다. 




여전히 뒷면이 끼면 라이트맵에 좀 문제가 있는데, 


이 부분은 




커스텀 파라미터에서 백페이스 톨로런스를 조절해 주면 해결할 수 있는 듯 하다. 

아까 저옵션때는 해결되었었음.





할 때 마다 잊어버려서 백업용. 


Shader "ltest"

{

        SubShader

        {

               Tags{ "RenderType" = "Opaque" }

 

               CGPROGRAM

               #pragma surface surf Lambert 

               struct Input

               {

                       float4 screenPos;//스크린 포지션을 받읍시다

               };

 

               sampler2D _CameraDepthTexture;

 

               void surf( Input i , inout SurfaceOutput o )

               {

                       float4 ScreenPos = float4( i.screenPos.xyz , i.screenPos.w + 0.00000000001 ); //0으로 나누는 사태만 방지하기 위해 작은 값을 넣습니다. 

                       float4 screenPosNorm = ScreenPos / ScreenPos.w; // 퍼스펙티브 제거

                       //screenPosNorm.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? screenPosNorm.z : screenPosNorm.z * 0.5 + 0.5;

                       //near클립 값이 0보다 크면 냅두고 작으면 하프 램버트 처리

                       float screenDepth= LinearEyeDepth(UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture,UNITY_PROJ_COORD(ScreenPos)))); // 깊이 텍스쳐를 스크린 좌표계를 이용해서 깊이값을 뽑아내고 그걸 리니어로 변환

                       o.Emission  = 1- ( screenDepth - LinearEyeDepth( screenPosNorm.z ) );

               }

               ENDCG

        }

       

}

 





없어서 내가 만드는 포스트 프로세스 V2 메뉴얼2






2. 포스트 프로세스 볼륨 사용하기 


이번엔 조금 응용해서 살짝 응용. 사실상 이번 포스트 프로세스의 개발 목적과 부합하는 녀석입니다. 

언리얼에서 사용할 수 있는 포스트 프로세스 볼륨을 유니티에서 사용할 수 있습니다. 


일단 카메라는 포스트 프로세스 레이어를 설정해 둡니다. 



그 상태에서 카메라에다가 볼륨을 달지 말고, 따로 볼륨 오브젝트를 만들어 줍니다. 


볼륨은 그냥 빈 오브젝트에 컬리더를 박아도 되고, 

하여간 컬리더만 있으면 됩니다. 뭐가 되었건. 


혹은, 이미 셋팅되어 들어있는 볼륨을 박아도 됩니다. 

이미 있는 볼륨은 여기 있습니다. 






이걸 박으면 




이렇게 생깁니다. 컬리더랑 포스트 프로세스 볼륨만 있는것. 이렇게 따로 수동으로 만들어도 똑같습니다. 



여기다가 아까 1부에서 만든 프로파일을 박아 봅니다. 

이번에는 Is Global을 꺼 봅니다. 이게 핵심입니다. 글로벌이 아니라는 거니까. 로컬이라는 말이죠. 즉 포스트 프로세스가 적용되는 영역을 정할 수 있다는 겁니다. 

레이어는 포스트 프로세스로 바꿉니다. 카메라에서 셋팅되어 있는 레이어와 같은 것이어야 합니다. 







변화가 없습니다. 

대신 이제 이렇게 하면 볼륨이 카메라가 닿으면 효과가 먹습니다. 

언리얼에 있던 바로 그 포스트 프로세스 볼륨과 같지요 





Distance를 설정하여 범위를 정할 수도 있습니다. 

그렇게 되면 예상할 수 있듯 

블렌딩이 되면서 천천히 효과가 나타나게 됩니다. 

여러 개 겹쳐 있을 때에는 Priority 로 우선순위를 결정하게 되겠고, 

Weight로 효과의 강도를 정할 수 있겠죠 






즉 이걸 이용하면 상당히 다양한 응용이 가능해 집니다 

일단 컬리더 모양으로 반응하므로, 각종 형태의 컬리더를 만들어 적용시킬 수도 있다는 거지요 


예를 들어서, 강한 스포트 라이트가 있고 그 안에 들어가면 눈부신 느낌이 난다고 해 보죠 


그럴때 스포트 라이트와 함께 포스트 프로세스 볼륨을 만들어 놓으면 그 조명 아래에 가면 화면 느낌이 달라질 수 있는 것입니다 




확실히 퍼포먼스를 위해 레이어를 설정해 놓는 것은 중요하겠네요