본문 바로가기

Unity3D/shader_스터디

[Unity 쉐이더] Vertex Color, Normal Map

버텍스 컬러 출력

색상 연산

러프 마스킹

노말 넣기

노말 대신 넣는 값

 


sunsimu1018.tistory.com/7

 

[쉐이더] 버텍스 컬러 활용

내용 정리 버텍스 컬러란?? 3D 맥스에서 버텍스 컬러 칠하기 Vertex Propertise Vertex Paint UV채널을 이용한 그라데이션 유니티에서 버텍스 컬러 칠하기 3Dmax에서 가져오기 Polybrush 버텍스 컬러 추가 묘사

sunsimu1018.tistory.com

버텍스 컬러에 대해 더 자세히 적어둠

 

버텍스 컬러란?

 

버텍스 컬러에 대해 알기위해 버텍스에 대해 알아보고 갑니다.

 

 

 

저번 UV 정보도 버텍스에 저장되는 것 처럼 색상값도 담을 수 있습니다.

버텍스 자체에 저장된 float4 RGBA의 정보를 버텍스 컬러라고 합니다.

각 버텍스의 사이값은 선형보간되며, 버텍스 컬러는 색상을 마스킹에 이용하는 등 여러 곳에 응용됩니다. 

 


 

 

버텍스 컬러를 유니티 내에서 그리기 위해서 Polybrush를 이용합니다.

Package Manager > Polybrush > Install

 

Tools > Polybrush

 

 

 

버텍스 컬러 출력

 

버텍스 컬러는

구조체 Input에서 불러올 수 있습니다. 

그 후 surf에서 바로 Albedo로 사용하거나 기존 색상에 Add, Multiply 등을 이용해 색상 변경이나 추가 묘사가ㄷ도 가능합니다.

 

Multiply를 이용해 봅시다.

 

 

 

더러워진 냉장고를

 

 

더 더럽게 만들거나 AO를 직접 그려줄 수 있습니다. 버텍스 수가 많아질수록 세밀한 묘사가 가능합니다. 

 


버텍스 컬러를 이용한 마스킹

 

이번에는 텍스쳐 2장을 사용합니다. 그래고 버텍스 컬러는 R값만 가져와 Lerp의 S값에 대입합니다.

 

 

 

이해를 돕기 위해 Albedo를 버텍스 컬러로 출력했습니다.

 

버텍스 컬러의 초기값은 흰색(1,1,1)으로 되어있기 때문에 검정(0,0,0)으로 변경 후 사용합니다.

아까 R값을 사용하기로 했으니 빨간색을 칠해줍니다. 그러면 

 

 

위와 같은 쉐이더를 적용시켰을 때 두번째 텍스쳐가 R값을 준 곳에만 나타나게 됩니다.

터레인에서도 볼 수 있었던 기능이죠. 배경이나 여러 오브젝트에 도움이 됩니다. 

 


응용1

 

위와 같은 방법으로 총 4개의 텍스쳐를 마스킹해보자 

 

 

 


변수 관리에 대해

 

위와 같이 기존의 o.Albedo를 가져와 새로 선언할 수 있습니다.

위의 방법은 아래와 같습니다. 그저 나누지 않고 한줄에 다 나타냈을 뿐 결과물은 똑같이 나옵니다.

결과는 같으니 더 보기 편한 방법을 선택하면 됩니다. 

o.Albedo = lerp(tex.rgb,tex2.rgb,IN.color.r);
o.Albedo = lerp(o.Albedo,tex3.rgb,IN.color.g);
o.Albedo = lerp(o.Albedo,tex4.rgb,IN.color.b);
o.Albedo = lerp(lerp(lerp(tex.rgb,tex2.rgb,IN.color.r),tex3.rgb,IN.color.g),tex4.rgb,IN.color.b);

 

아래와 같이 변수를 새로 만들어도 결과는 똑같습니다. 대신 변수가 많아질 수록 관리하기 어려워집니다.

float3 lerp1 = lerp(t.rgb,t2.rgb,IN.color.r);
float3 lerp2 = lerp(lerp1,t3.rgb,IN.color.g);
float3 lerp3 = lerp(lerp2,t4.rgb,IN.color.b);
o.Albedo = lerp3

Normal Map

 

위의 응용1번에 노말맵을 추가해봅시다.

평소 텍스쳐를 추가하는 것과 비슷하지만 float3를 사용하며, UnpackNormal을 앞에 추가합니다.

 

 

 

 

 

그리고 노말을 출력합니다. lerp를 사용하는데 노말이 없는 곳의 값에는 무엇을 넣어야 할까?

보통 파란색을 넣는다고 합니다. 감마가 적용되지않은 노말맵은 옅은 연보라+파란색 에서 파란색이 됩니다. 분해해봤을 때 주로 B채널은 z축 벡터값을 1로 맞춰 백터 연산을 쉽게하는데 사용한다고 하는데 지금은 노말에 대해서 잘 모르니 파란색을 넣는구나 하고 넘어갑시다. 

 

파란색을 모를때는 BumpMap을 하나 더 추가해 초기값으로 때우려고도 했습니다.

 


이 상태로 적용을 해보면 오류가 뜰 것 입니다.

너무 많은 텍스처 인터폴레이터 어쩌구 저쩌구 최대 8개 중 9개를 사용하고 있다. #pragma target 3.0을 추가해보라고 친절하게 설명해주고 있습니다.

 

 

 

여기서 인터폴레이터 개수에 대해 다시 얘기가 나옵니다. 이제 #pragma target 3.0 에 대해 알고 있으니 더 이해하기 쉬워졌죠. 코드를 정리하며 지운 #pragma target 3.0은 쉐이더 모델 3.0을 사용하라고 처리 명령을 내린 것입니다. 

 

그걸 지우면 자동으로 2.0을 사용하게 됩니다. 2.0은 8개, 지금까지 텍스쳐는 5개, Lerp를 4번 사용해 인터폴레이터를 총 9개 사용했고 천장에 머리를 박은 것입니다.