강의중에 갑자기 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로 효과의 강도를 정할 수 있겠죠 






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

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


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


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




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


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



유니티 포스트 프로세스 V2가 나왔습니다. 아니 안나왔죠. 아직 프리뷰 상태입니다 

상윤에반말로는 모바일 퍼포먼스가 좋아졌다라고 하는데.. 뭐 그건 그런가 보다 하고 


일단 다운 방법부터 달라졌습니다. 


2018부터는 아마추어같이 어셋 스토어나 깃허브에서 받는게 아니라 이제 정식으로 패키지 메니져에서 받을 수 있게 되었습니다. 

이외에도 여러 개 플러그인들이 다운로드가 가능하게 되었으니 매우 좋습니다. 




어쨌건 다운로드 받아 봅니다 .




그리고 메뉴얼을 열심히 찾아 봤는데 



없어 .... 야 메뉴얼이 없는데 출시하기 있냐 없냐. ..... 보고 있나 유니티 


영 맘에 안들지만 

상윤을 목졸라서 사용법을 대충 알아낸 다음 좀 연구를 해 본 끝에 사용법을 이제 알게 되었습니다. 




1. 포스트 프로세스 V2 기본 사용하기 



일단 포스트 프로세스가 뭔지는 굳이 말하지 않겠습니다. 이건 뭐 학생들도 너무 잘 알고 있는 수준이라 말을 줄이고.. 



초기의 포스트 프로세스 (후처리) 는 카메라에 컴포넌트를 하나하나 붙이는 방식이었습니다. 덕분에 포스트 프로세스의 붙이는 순서가 너무나도 중요했죠. 

그리고 두 번째 나온게 포스트 프로세스 스택. 이건 포스트 프로세스가 다 붙어서 나온 녀석이었고

다시 개선해서 이번에 나온게 이 녀석입니다. 


일단 설치하고 나면, 기존과는 다르게 3개의 컴포넌트가 생깁니다 

Post Process Layer

Post Process Volume

Post Process Debug




일단 그럼 무식하게 진행을 해 보죠 


일단 카메라에 Post Process Layer를 추가합니다 

섬세한 메뉴 설명은 일단 나중에 합시다. 

아참 그래도 레이어는 Everything 으로 해야 합니다. - 사실은 저렇게 하면 안되고 특별히 레이어를 따로 정해줘야 퍼포먼스에 좋다고 합니다만 일단 그냥 켜보는 걸로 - 




그 다음 포스트 프로세스 볼륨도 카메라에 추가합시다. 

다르게 쓰는 방법도 있지만 일단 이렇게 해 봅시다 

우선 켜 보는게 중요하니까. 





그 다음. 전체에 적용해야 하니까 Is Global 체크를 해줍시다. 

그리고 포스트 프로세스 프로파일을 만들어 줍니다. 따로 만들어도 되지만 New 버튼으로 해도 되지요 

우선순위 (Priority) 는 지금 뭐 큰 상관은 없습니다. 하나밖에 없으니까. 하지만 기분이라서 1로 해줄께요 





이제 Add effect를 눌러서 포스트 프로세스를 추가해 주면 됩니다. 

Bloom 을 한 번 적용해 볼까요 




놀랍게도 저게 적용된 화면입니다. 전 처음에 저거 블룸이 안되는 줄 알았어요 

저기서 Intensity 앞 회색 공을 눌러주면 켜집니다. 




정리하자면 


1. Post Process Layer를 추가 

레이어를 Nothing이 아닌 , 소프트 프로세스 볼륨이 들어있는 레이어를 선택해 줘야 합니다. 


2. Post Process Volume 을 추가 

사실 꼭 카메라에 해줄 필요는 없지만 일단은 카메라에. 

글로벌 옵션 켜기. 프로파일 추가 


3. Post Process Profile에 기능 추가 

필요한 포스트 프로세스 기능을 추가하고 값 올려주기 

 



유나이트 서울 2018 강연자료입니다 
이 날 장비문제로 열심히 작업했던 애니메이션이 다 날라가서 너무 가슴아팠던... 

그래서 행여나 애니메이션이 적용된 PPT를 보시고 싶으신 분은 
 

https://1drv.ms/p/s!AsdnEBfz51bLgd1h8ORz4KWR6dBSvQ


에서 받아보실 수 있으십니다. 한시적 공유합니다. 


PDF 공유 주소는 다음과 같습니다. 


https://1drv.ms/b/s!AsdnEBfz51bLgd1jMdcLeyY8NBblrg



이전 포스팅에 따르면 sRGB 모드여도 A 는 리니어 모드라는 가정을 내린다. 

그럼 정말인가 알아보자. 


위에가 RGB 아래가 A 이다. 확실히 아래쪽이 Linear 그라디언트의 특성을 보인다.


그래서 그대로 출력해 보았다. 


확실히 차이가 보인다. 


여기서 첫 번째 가정은 RGB는 sRGB 이고 A 는 Linear 인 것이다. 



그 가정이 맞다면, sRGB를 끄면 RGB가 Linear가 되니 두 그림은 똑같아 져야 한다. 



두둥...


sRGB를 껐지만 결과는 다르다. A는 ... Linear보다 약간 더 제곱한 수치로 보인다. 



그래서 이번엔 반대로 찾아봤다 



다시 원래대로 복구. 


여기서 A 값에다가 2.2 pow를 주면 위에와 똑같아지는가를 찾으면 될 것이다. 


return pow(col.a,2.2);



확실히 아니다. 도대에 A는 무슨 값이란 말인가?


궁금해서 역추적을 해 본다. 


A 가 Linear라면 2.2 제곱을 하면 위의 RGB랑 같을텐데, 안 같고 더 어둡다... 

A는 2.2가 아닌 것인가? 


무식하게 수치를 찾아보자. 


return pow(col.a,1.75);




1.75에서 일치되었다. 


이건 뭘까...? 물어봐야겠다 


덧) 나크님이 닷 그레인 20% 쪽 힌트를 주셨다

즉 포토샵에서도 알파는 다르게 처리한다는 것. 

연구해 볼 필요가 생김




알다시피 텍스쳐는 sRGB 처리가 되면서 Gamma Correction 을 거치기 위해 (뭐 정확히 그것만을 하기 위해서는 아니지만 하여간) 내부적으로 밝아지게 된다. 


그리고 Linear Pipeline에서는 이 텍스쳐는 다시 원래 '선형' 으로 돌아온다. 즉 어두워진다. 그리고 계산된다. 



근데 일단 이건 RGB를 말하는 거다. 


만약 이 이미지에 있는 알파 채널은 어떻게 될까? 예상컨데 동일하게 작동될 것이라 생각할 수 있다. 


즉 회색(감마 코렉션에서 차이가 가장 큰)을 리니어 처리하면, 

회색 - 밝은 회색을 거쳐 - 다시 회색

으로 돌아오므로 

RGB도 A도 동일하게 작동될것이라고 상상할 수 있을 것이다. 


즉 RGB를 회색으로 만들고 A도 회색으로 만들면, 


RGB나 A나 전부 저렇게 반응할 것이라고 생각할 수 있을 것이다. 


sRGB니까. 



그럼 테스트를 해보자. 



포토샵에서 그레이RGB와 그레이A 를 만들었다. 


         


둘은 아무리 봐도 똑같이 생겼다. 


그리고 유니티로 넘겨보자. 


위 가정대로라면 유니티로 넘겨도, RGB와 A가 같은 색이어야 할거다. 



그리고 결과. 



   



놀랍게도 A가 더 밝다! 분명히 전환하면 반짝 하면서 밝아진다!! 




자세히 재 보진 않았지만 느낌적으로 이건 밝아진 상태 그대로이다! 그것도 알파만! 


즉 이런거다. 


sRGB로 이미지를 만들었고 이미지에 sRGB 옵션을 켰다 하더라도 


sRGB는 RGB에만 적용되는거고 

A 는 Linear로 동작하고 있다는 말이 된다. 


즉 RGB만 '이미지' 로 취급하고 있고, A만 '데이터' 로 취급하고 있다는 말이다. 


어쩐지.. 

아래에 보이는 Albedo의 A를 Smoothness에 사용한다는 말이 영 걸리더라... 

그랬더니 지금과 같은 결과가. 

그래 이렇게 되는 거면 저기다 넣어도 아무 문제 없다는 말이다... ㄷㄷㄷㄷ 





프로젝트 D 연구정리.

2018.01.29 18:39

PROTECTED ARTICLE. TYPE THE PASSWORD.

포토샵에서 그라디언트를 그려보면




이케 나오는데요. 


요거요거, 그라디언트 툴을 이용해서 정확히 그린 그라디에이션이예요. 무려 수 학 의 힘을 빌려 그린 거지요. 

차암 정확하겠죠?!??!? 



근데 그거 아세요? 이거 사실은 틀 린 거라는거요 

저거 솔직히 보세요. 너무 어둡지 않아요? 뭔가??? 







실제 제대로 된 그라디언트는 저렇게 안생겼어요 제대로 되었다는 말은 검은색 ~ 흰 색 까지 제대로 된 비율로 증가한다는 거고 

그 그라디언트는 저렇게 생기지 않았다고요!!


지금부터 보여드릴께요. 제대로 된 혼신의 그라디언트를!! 




짜잔. 


이게 여러분들의 모니터에서 볼 수 있는 '제대로 된' 그라디언트입니다. 굉장히 이질적이죠? 이런거 본 적 없죠? 

요거 .. 포토샵에서 그린게 아니거든요. 




넹 요건 유니티에서 수학 연산으로 출력한 그라디언트거든요. 

이게 진짜예요. 


근데 왜 포토샵에서는! 어두워 보이느냐!!


사실 포토샵에서도 제대로 그리고 있어요!!! 


근데 모니터 감마를 거치느라 어두워 진거라고요!! 

그래서 포토샵에서 회색은 진정한 회색이 아닌 겁니다!! 





http://chulin28ho.tistory.com/241



포토샵에서의 128 즉 회색은 진정한 회색보다 많이 어두워얌!!! 사실 187이 더 회색에 가까워얌!!

포토샵에서의 색상 수치값은 사실 우리가 알고 있는 정상값과는 거리가 있는거예얌!!




그래서 무슨 문제냐고요? 




아니 뭐 그냥 그림 그릴땐 문제 없어요 



잘못된 그라디에이션이면 뭐 어때. 그대로 포토샵에 나오는대로 나오면 됐지


그래서 포토샵에서 그린 그라디에이션을 유니티로 가져와 봤어얌. 




아래가 포토샵에서 가져온 거예얌!!! 

그래요!! 뭐 포토샵이 틀렸다고? 뭐 어쩌고 하는데 알게 뭐얌!! 포토샵과 똑같이 가져와 지니 걍 되는거 아닌가염!!!!



그래여 뭐 그냥 텍스쳐 그려서 넘길때는 문제 없어얌. 


네 안심하셈. 



그런데....


셰이더 짜는 사람이나 이펙터나 TA 들에게는 좀 문제가 있어얌!!!


이사람들은 '그림' 데이터가 아닌 '정확한 수치' 데이터를 텍스쳐로 처리할 때가 있단 말예얌!!!!


예를 들어 노말맵. 


이거 벡터 각도를 나타낸 맵이예염. 이건 이쁜게 문제가 아니라 정확해야 한다고. 


그리고 또 마스크맵들. 예를들어 러프니스 맵, 메탈릭 맵 이런거. 


이것도 이쁘라고 그린게 아니라 정확하라고 넣은 수치 데이터잖아!!!!!!!


이런 것들은 이렇게 틀린 그라디에이션으로 그냥 넘어오면 안되얌!!!! 수치가 중요하니까!!! 


그래서 정말 제대로 수치로 넘겨야 할 것들은




이걸 꺼줘야 한다는 거예염!!!!!!!!!!! 저거 봐 봐 sRGB 칼라 텍스쳐라고 되어 있잖아...

즉 칼라 텍스쳐가 아닌 '데이터' 는 저걸 꺼줘야 해염!!! 


그러면 어떻게 되냐면.. 




짠 


같아졌죠 


아래것이 미묘하게 어두운 것 같... 닥쳐 


이게 진짜 '수치적으로 리니어한 그라디언트' 를 눈으로 보는 거예얌. 그리고 수치 데이터 텍스쳐들은 이 옵션을 써야 하는 거임.