[유니티 쉐이더 스타트업] Part 05 | Surface Shader를 이용해서 텍스쳐를 제어해봅시다

jungizz_·2023년 1월 27일
0

Unity Shader StartUp

목록 보기
5/17
post-thumbnail

2. 텍스쳐 입력과 출력

  • 텍스쳐 출력
  1. 텍스쳐를 입력받는 인터페이스 생성 (_MainTex가 텍스쳐를 입력받는 변수)
  2. 입력받는 텍스쳐를 sampler로 받기
  3. Input 구조체 안에 vertex가 가지고 있는 uv를 엔진으로부터 가져오라고 명령 (uv는 u와 v 2개의 숫자로 이루어진 float2)
  4. 텍스쳐를 연산하는 tex2D함수로 텍스쳐의 컬러를 화면에 출력
//tex2D 함수
float4 결과 = tex2D(샘플러, UV)


3. 흑백 이미지

  • 흑백 이미지의 속성
  1. R, G, B 모두 동일한 숫자
  2. R, G, B 각 요소에 따른 강도의 평균
void surf(Input IN, inout SurfaceOutputStandard o){
	float c = tex2D(_MainTex, IN.uv_MainTex);
    o.Albedo = (c.r + c.g + c.b)/3; //흑백 이미지
    o.Alpha = c.a;
}


4. lerp 함수로 텍스쳐 두 장 합치기

  • lerp: Linear Interpolation(선형보간)
//lerp 함수
lerp(X, Y, s) //X, Y는 같은 단위, s는 float
  • 텍스쳐 두 장을 받는 인터페이스를 넣어준 후, lerp기능을 사용한다.

  1. o.Albedo = lerp(c.rgb, d.rgb, 0);

  2. o.Albedo = lerp(c.rgb, d.rgb, 1);

  3. o.Albedo = lerp(c.rgb, d.rgb, 0.5); 까무잡잡한 잔디 완성🌿

  • lerp 함수 응용
  1. s인자를 인터페이스에서 입력받기

  2. s인자를 알파 채널로 넣기

  • 두번째 이미지의 알파채널 (검은색은 0, 흰색은 1)
  • 알파 채널 강도를 보기 위해 첫번째 이미지 수정
  • s인자를 두번째 이미지의 알파채널로 넣으면, 알파채널의 검은색 부분은 0이므로 c텍스쳐가 나오고, 흰색인 부분은 1이므로 d가 나오게 된 것이다.
    o.Albedo = lerp(c.rgb, d.rgb, d.a);
  • s인자를 첫번째 이미지의 알파채널로 넣은 경우는 아래 사진처럼 된다.
    o.Albedo = lerp(c.rgb, d.rgb, c.a);
    • 위 방법을 응용하면, 반복된 타일로 이루어진 벽에 검은 물이 흐른 자국 등을 만들거나, 마을의 벽돌 바닥에 새겨진 마크 등을 그릴 수 있다.
profile
( •̀ .̫ •́ )✧

0개의 댓글

관련 채용 정보