제보 감사합니다 ㅠㅠ


p65 / 73


머릿말에 유니티 셰이더 구성이라고 되어 있습니다. 

유니티 쉐이더 구성이라고 정정합니다. 


마찬가지로 기초적인 서피스 셰이더를 제작해 봅시다 라고 되어 있습니다 

기초적인 서피스 쉐이더를 제작해 봅시다 라고 수정합니다. 





P111


gg.r은 0

이 아니라 0.5 이므로 출력된 숫자는 (0,0.5,1) 이 됩니다. 



p341


중간 부분 수식

o.Alpha = rim * sin(_Time.y * 0.5 + 0.5) ; 

가 아니라

o.Alpha = rim * (sin(_Time.y) *0.5+0.5) 

입니다. 


아래 수식 

o.Alpha = rim * sin(_Time.y * 0.5 + 0.5); 

가 아니라

o.Alpha = rim * abs(sin(_Time.y)); 

입니다. 



p342


float4 coor:COLOR

가 아니라 

float4 color:COLOR


입니다. 




p355 


그러므로 이 연산 후에는 normalize( ) 란 함수 며령으로 다시 길이를 1로 조절해줄 필요가 있습니다 


<->


그리고 우리는 또 하나도 배웠던 기억이 납니다. '이렇게 두 벡터를 더한 결과는 길이가 더이상 1이 아니다' 라는 것도 말입니다.  그림으로 봐도 일단 길이가 1이 아닌 것을 알 수 있습니다. 


위 두 문구가 서로 바뀌었습니다. 



p357


Blinn-Phing 


가 아니라 


Blinn - Phong 입니다. 





저작자 표시 비영리 동일 조건 변경 허락
신고

'저처럼' 듀얼이나 트리플 모니터를 왔다갔다 하는 노트북 사용자에게 자주 일어날 수 있는 일입니다. 

뭐냐면... 창 하나가 저어어어어ㅓ어ㅓ어어엉어ㅓㅇ어 쪽 모니터에 가 있는데 

그러다 보니 갑자기 어떤 상황에서 창을 눌러도 안보이는 그런 상황이요 

창이 어디갔지? 헤매다가 

'에이 초기화 시켜 버려야겠다' 


하는 그런 상황을 말합니다. 




검색해봤더니 무슨 .. 카페 광고 낚시 동영상이나 있고 

자기 스크립트를 쓰라는 둥 헛소리들이 많길래 

검색해 보니 있길래 정리합니다. 


일단 원문의 위치는 여기 


https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/sfdcarticles/sfdcarticles/Resetting-3ds-Max-3ds-Max-Design.html


방법은 매우 간단합니다. 



방     법 

==================================================================


C:\Users\%username%\AppData\Local\Autodesk\3dsMax\2017 - 64bit\ENU 


를 찾아가서 ENU 폴더를 찾습니다 (유저 환경 폴더)



그냥 삭제해도 좋지만 불안하니까 이름을 바꿔줍니다. 


ENU_OLD 정도로 괜찮을까요 


그리고 맥스를 다시 실행하면 새로운 ENU 파일이 생기면서 모든 유저 환경이 리셋되게 됩니다. 



개인 세팅을 만들어 놓으신 분들은 백업을 잘 하시고 (여차하면 old  폴더로 돌리면 되니까 )

이렇게 해서 어쨌건 창 위치를 초기화 할 수 있습니다. 




저작자 표시 비영리 동일 조건 변경 허락
신고

일단 이 이미지를 준비함다. 당연히 타일링 되어 있어야 함. 



왼쪽 아래가 0,0 인건 알죠. 

오른쪽 위가 1,1 인것도 알죠 


그럼 먼저 저 중에서 7 이란 글씨만 나오게 하려면 

UV에 1/3을 곱해야 할 겁니다. 


이케요. 


저 Divide는 1/3 입니다. 


즉 이제 이 UV는 


0,0 에서 0.33333,0.33333 이 되었습니다. 




다음은 이동을 시켜야겠네요 


일단 가로로만 이동을 시켜보죠 


가로로 이동시키려면... 


UV중  U에다가만 더해줘야겠네요 0.33333씩 더해주면 되겠죠?




제가 제일 싫어하는 노드방식의 귀찮은 점이 나왔네요 

컴포넌트로 나눴다가 어펜드로 합쳐주기 으 극혐. 


하여간 U 에다가만 0.3333 을 더해주니 (1/3 이 그나마 좀 더 정확하겠지만 뭐...) 

8이 나왔습니다. 여기에 이제 0.66666을 더해주면 9가 나오겠죠 


그럼 이제 



0,

0.333333,

0.666666


이 순서대로 번갈아 나오게만 하면 됩니다. 




그건.. 역시 만만한건 '시간' 이죠 

솔직히 이거말고 셰이더 내부에서 쓸만한건 없습니다. 



일단 시간을 3으로 나눈 나머지값을 구합니다. Fmod가 A 를 B로 나눈 '나머지값' 만 구하는 거거덩요 

저는 여기 3을 넣어 놓았으니 ... 


다른건 몰라도 어쨌건 나오는 값은 


0 ~ 2.99999 사이의 값이 되겠지요. 정확히는 0에서 시작해서 2.99999 로 증가하고 다시 0으로 되는 애니메이션이 될겁니다 3으로 나눈 후 '남은 나머지' 값이니까요. 시간은 계속 증가하고요 



이제 Ceil로 정수로 '올림'  을 해주지요 


0.1~1 까지는 1이 될테고 

1.1~2 까지는 2가 될테고

2.1~2.9999까지는 3이 될테고.. 


사실 완벽한 0.0일때는 0이 되어 버리므로 곤란합니다만 워낙 짧을테니 걍 넘어가 보죠 

(이상하면 고치지 뭐. 간단하게 0.0001 더해주면 되잖아) 

하여간 1,2,3 이 번갈아 나오게 만들어 졌습니다. 


여기다가 0.3333을 곱해주면 되겠죠 




이제 0.33333 , 0.66666, 0.9999 를 더하게 되었습니다. 


이렇게 하고 보니까, 좀 문제군요. 


작동은 잘 될겁니다만... 


0 + 0.33333 

0 + 0.66666

0 + 0.99999


요건 7,8,9 순으로 나오는게 아니라 

8,9,7 순으로 나오는 거잖아요. 0부터 시작하는게 없어졌잖아!!!!!




뭐 사실 그냥 보기엔 문제가 없습니다만. (789나 897이나..) 좀 더 정확히 나오게 하기 위해서 개선합시다. 



그래서 개선했습니다. 올림이 아니라 내림으로 . 


이제 1,2,3으로 변하는게 아니라 

0,1,2로 변하니까


0.33333 , 0.66666, 0.9999 로 변하는게 아니라 

0 , 0.333333 , 0.66666 으로 변합니다. 


됐다 이제 





이제 제대로 돌아간다뇨 



'최소한 가로는' 제대로 돌아갑니다. 


이제 정리시간이죠


'지금은 3개밖에 안되지만 가로가 몇 개인지 입력하면 그대로 돌아가는 시스템' 을 만들어 보세요 

(난데없이 숙제)





뭐 이케 만들면 됩니다. 개쉽죠 



===============================================================



이제 어려운건 세로죠 세로 



세로도 뭐 기본은 같습니다만... 


이렇게 생각해보죠. 


0 일때는 UV가  (0.0 , 0.0)이 되고 

1 일때는 UV가  (0.3 , 0.0)이 되고 (귀찮으니까 0.3333은 더이상 안쓸께요 ) 

2 일때는 UV가  (0.6 , 0.0)이 되고

3 일때는 UV가  (0.0 , 0.3)이 되고

4 일때는 UV가  (0.3 , 0.3)이 되고

5 일때는 UV가  (0.6 , 0.3)이 되고

6 일때는 UV가  (0.0 , 0.6)이 되고

7 일때는 UV가  (0.3 , 0.6)이 되고

8 일때는 UV가  (0.6 , 0.6)이 되고


잠깐 지금 당신, 프로그램 좀 배웠다고 for문 쓰면 된다고 생각했죠?

안돼요 안돼. for문은 한 패스에 다 도는 거라고요 
지금은 다음 패스엔 다른 숫자가 나오고 그 다음 패스엔 숫자가 늘어나는 식이라고요 
외부에 뭔가 누적되어야 해요 

그래서 for문 쓰면 안되고요 
무조건 시간에서 0~8이라는 숫자를 뽑아내야 합니다. 

뭐 시간에서 0~8 뽑아내는 거야 쉽죠 


저기서 Fmod의 B를 9로 해주면

따란 ~ 


에 보이는건 없지만... 에.. 안믿을라고요? 설마??? 에잉미워

시간 순서대로 0 ~ 8까지 나오는 거잖아요 저거 

저거만 있으면 일단 끝 

당장 이전 시간에 가로로 3개씩 되는거 만들었으니까 이제 이 공식만 만들면 돼요 


0 일때는 UV가  (0.0 , 0.0)이 되고 

1 일때는 UV가  (0.3 , 0.0)이 되고

2 일때는 UV가  (0.6 , 0.0)이 되고


====================


3 일때는 UV가  (0.0 , 0.3)이 되고

4 일때는 UV가  (0.3 , 0.3)이 되고

5 일때는 UV가  (0.6 , 0.3)이 되고

===================

6 일때는 UV가  (0.0 , 0.6)이 되고

7 일때는 UV가  (0.3 , 0.6)이 되고

8 일때는 UV가  (0.6 , 0.6)이 되고


에...그냥 if문 쓸까... 계산식으로 안될까요 
고민해 보자.. 

음 역시


3으로 나눠서 또 내림하면 되겠다!! 

0/3 = 0
1/3 = 0
2/3 = 0
3/3 = 1
4/3 = 1
5/3 = 1
6/3 = 2
7/3 = 2
8/3 = 2

오케이 이걸로 V를 만들면 될 거 같음. 


그럼 U는?

0일때 0
1일때 1
2일때 2
3일때 0
4일때 1
5일때 2
6일때 0
7일때 1
8일때 2

가 나와야 하니 뭔 공식이 있을까나

음?
아까 나온 V 값에 3을 곱해서 빼기하면?

0일때 0-0*3 = 0 
1일때 1-0*3 = 1
2일때 2-0*3 = 2
3일때 3-1*3 = 0
4일때 4-1*3 = 1
5일때 5-1*3 = 2
6일때 6-2*3 = 0
7일때 7-2*3 = 1
8일때 8-2*3 = 2 


뭔가 좀 스마트한 느낌은 아니지만 잘 되었다. 이걸로 U도 구함. 

자 그럼 이것을 대입시켜서 만들어 보자 


float spriteindex = floor(fmod(_Time.y, 9));
float V = floor(spriteindex/3));
float U = (spriteindex  - V*3);

float2 uv = texcoord.xy + float2(U * (1/3),V*(1/3));
 

근데 V 값이 오픈GL은 거꾸로야 ㅋㅋㅋ
그래서 V 값은 1-x 로 뒤집어 줘야 합니다. 



자 정리

일단 스프라이트 인덱스는 다음과 같습니다 .



V 인덱스는 이렇게 구합니다 



U 인덱스는 이렇게 구합니다 





 
 파이널 계산식은 이렇습니다 



 
 한 번에 보면 다음과 같아요 



 





에 뭐 근데 사실 귀찮죠 



그러니


내장된 Flipbook UV animation 노드를 쓰도록 합시다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

위 모든 과정이 노드 하나에 들어 있어요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ









저작자 표시 비영리 동일 조건 변경 허락
신고