본문 바로가기

Unity3D C#/유니티 쉐이더 공부

쉐이더 조절로 이미지 흑백 만들기와 Lerp 함수의 기본

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Shader "Custom/NewSurfaceShader" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
 
        sampler2D _MainTex;
 
        struct Input {
            float2 uv_MainTex;
        };
 
        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
cs


쉐이더 조절로 이미지 흑백 만들기


        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = (c.r + c.g + c.b)/3;
            o.Alpha = c.a;

위와 같이 계산하면 쉽게 이미지 흑백으로 만들 수 있음.

각 요소의 평균을 구한 결과와 동일하게 되어 한 자리 숫자로 나오게 됨.



Lerp 함수

lerp는 Linear Interpolation의 약자, '선형보간'이라고 함

'직선적인 비율로 값이 변환되는 것'을 의미함


lerp 함수는 다음과 같이 사용되고, X, Y는 같은 단위여야 하고 s는 float이어야 함

lerp (X, Y, s)


일반화

일반적으로 두 지점 에서의 데이터 값이 각각 일 때,  사이의 임의의 지점 에서의 데이터 값 는 다음과 같이 계산할 수 있다.

단, 은 에서 까지의 거리, 는 에서 까지의 거리를 말한다.

만일 거리의 비를 합이 1이 되도록 정규화하면 () 위 식은 다음과 같이 단순화될 수 있다.


예시

예를 들어, 오른쪽 그림과 같이, 두 끝점 와 가 주어져 있을 때, 그 사이에 위치한 의 값을 추정하기 위해 두 점 사이에 직선을 긋고 다음과 같은 비례식을 구성할 수 있다.

이 수식을 풀면, 어떤 주어진 값 에 대한  값을 다음과 같이 구할 수 있다.


프로그래밍

선형 보간법은 다음과 같은 방법으로 프로그래밍을 할 수 있다.

1
2
3
4
// p1,p2를 d1:d2로 분할하는 p를 리턴한다. (단, d1+d2=1)
float lerp(float p1, float p2, float d1) {
  return (1-d1)*p1 + d1*p2;
}
cs

p1, p2사이의 임의의 지점 p에서의 데이터값 f(p)는 다음과 같다.

따라서, 


선형보간법 설명 출처 - https://ko.wikipedia.org/wiki/선형_보간법