UnityShader(10)
-
카툰 렌더링 만들기. (프레넬 외곽선, 램프텍스쳐, 스무스스텝 스페큘라)
내용에 앞서, 프로젝트 진행 상태는 2Pass Outline 기법을 통해 외곽선을 구현했고, 물체의 노말방향과 조명 벡터를 내적해 음영을 구현한 상태를 가정한다. 2Pass를 이용하는 방식은 렌더링을 두번 하는 것이므로 무겁다는 단점이 있다. 또한 Plane으로 끝나는 부분에서는 외곽선이 생기지 않고, 각진 면에서는 선이 끊어진다는 문제점이 있다. 이 포스팅에서는 2Pass를 이용하는 방법 대신 Fresnel 방식으로 외곽선을 구현해볼 것이다. Fresnel 외곽선 구현 림라이트를 만들었던 Fresnel 연산 후 if문을 사용해 외곽라인을 검출해서 외곽선을 칠해주면 된다. 그러나 이 방식은 기본적으로 각 픽셀의 노멀 방향과 시선방향의 차이로 계산되는 외곽선이기 때문에 완전한 평면을 가진 오브젝트에서는 이..
2022.03.04 -
22.02.25 쉐이더 라이팅, 커스텀 라이트
쉐이더 라이팅의 종류 램버트 반사광이 없는 가장 가벼운 라이팅 구현 방식. 단지 빛에 의한 밝고 어두움만 구현했다. 이 라이팅을 사용하려면 pragma의 surface surf Lambert 를 써야 하고, surf 함수의 두번째 인수의 타입을 surfaceOutput으로 지정해야 한다. 블린퐁 스페큘라(반사광)을 가볍게 구현했다. (스탠다드 방식과 그 구현법이 다름) 블린퐁 방식은 스페큘라를 구현하기 위해 프로퍼티에 반드시 _SpecColor 를 선언해줘야 한다. 또한 변수는 절대 생성해선 안 되고, surf함수에서 o.Specular와 o.Gloss 값을 float로 조절해준다. o.Specular는 반사광의 크기, o.Gloss는 반사광의 강도를 뜻한다. #pragma surface surf Bli..
2022.02.26 -
22.02.24 쉐이더 폴리브러쉬와 멀티텍스쳐링
유니티의 폴리브러쉬를 이용해 메쉬의 버텍스에 색을 칠할 수 있다. 폴리브러쉬와 lerp 함수를 이용해 멀티 텍스쳐링을 할 수 있다.
2022.02.24 -
22.02.23 유니티 쉐이더 스타트업
텍스쳐를 입히기 위해 uv 매핑을 한다. uv공간 상에서 해당 버텍스들의 위치를 정해준다. 어떤 복잡한 메쉬든 uv의 좌표 안에 들어갈 수 있다. 해당 메쉬를 해체하여 버텍스들을 uv공간 안에 담은 것 = UV맵. 왜? 2D 텍스쳐를 3D모델에 입히기 위해서. 외부 인터페이스에서 받는 값이 아닌 유니티 내부로부터 받는 데이터는 struct Input 구조체 안에 선언해야 한다. half 는 float의 반, fixed 는 half의 반 _Time은 유니티 쉐이더 내장 함수. rgba 값을 갖고 있고 g번째 요소는 원래 시간을 나타내준다. 시간을 tex2D함수의 텍스쳐 좌표의 칼라를 가져오는 식에 더해서 텍스쳐 애니메이션을 만들 수 있다. 에디터에서 _Speed float를 받아서 애니메이션의 속도를 조절..
2022.02.23