-
[유니티 쉐이더 스타트업] 이미지를 흑백으로 만들기프로그래밍/Unity Shader 2019. 5. 20. 16:50
https://zerodeg.tistory.com/40
[유니티 쉐이더] 쉐이더 코드를 깔끔하게 정리하는법
https://zerodeg.tistory.com/39 [Unity Shader] 색상을 입력 받아 출력해보기 - 2 https://zerodeg.tistory.com/36?category=812191 [Unity Shader] 색상을 입력받아 출력해보기 https://zerodeg.tistory.com/35..
zerodeg.tistory.com
안녕하세요. 저번 시간에는 쉐이더 코드를 깔끔하게 정리하는 법에 대해서 다뤘는데요. 오늘은 이미지를 흑백으로 만드는 방법에 대해서 알아보려고 합니다. 코드를 정리한 상태로 시작할 것이기 때문에 저번 포스팅을 읽지 않으신분은 저번 포스팅을 보고 오시면 좀 더 이해하기 쉬울거에요^^ 그리고 오늘 주제가 이미지를 흑백으로 만들기 이지만 완전히 쉐이더 코드를 새로 만든다는 가정하에 작성하고 있으니 급하신 분들은 맨 아래쪽을 보시면 곧바로 어떻게 흑백 이미지를 만드는지 보실 수 있답니다.
그럼 먼저 코드를 아래와 같이 정리하고 시작하도록 하겠습니다. Matetial과 Shader는 새로 만들어주세요. 저번 시간에 코드 정리한 것과는 살짝 다르니 꼭 아래 코드와 같이 설정해주세요.
Shader "Custom/Tex" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf Standard sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
저번 시간에 코드 정리를 했던 것과는 조금 다르죠? MainTex를 지우지 않았고, 그로 인해서 Input 구조체 안에 있던 uv_MainTex도 지우지 않았습니다. 그리고 surf 함수에서 fixed4로 선언되어 있는 c 변수도 그대로 살아있습니다. 대신 Color 인터페이스와 변수가 사라짐으로써 * _Color 라고 적혀있던 부분이 삭제되었습니다.또 #pragma surface surf Standard fullforwardshadows 라고 적혀있던 부분에서 fullforwardshadows도 삭제가 되었는데요. 이 구문은 모든 라이트에게서 그림자를 생성한다는 의미인데, 이 구문을 삭제함으로써 기본 라이트인 디렉셔널 라이트에 의해서만 그림자가 생성되도록 변경되었습니다.
sampler2D _MainTex; struct Input { float2 uv_MainTex; };
여기서 가장 중요한 부분이 바로 위의 코드인데요. sampler2D가 자료형이기 때문에 _MainTex가 단순히 변수라고 생각하고 변수 이름을 변경할 수가 있는데, 절대로 그렇게 하면 안됩니다. 엔진에게 vertex 내부에 있는 uv를 가져다 달라고 요청하는 것이기 때문에 내부에서 정해진 규칙대로 적어주어야 하기 때문입니다. 즉, sampler2D형의 _MainTex 변수를 _SubTex 혹은 _Tex와 같이 임의로 변경해선 안된다는 의미입니다. 궁금하신 분들은 변수이름을 변경하고 surf 함수에서 tex2D 매개변수로 사용되고 있는 변수의 이름까지 변경해주시고 유니티를 보시면 무슨 말인지 이해를 하실 겁니다.
Input 구조체에서도 마찬가지인데요. uv는 2개의 숫자로 이뤄지므로 float2이고, _MainTex의 uv라는 뜻으로 uv_MainText라고 적혀있는 것입니다. 이 역시 변경하면 제대로된 결과가 나오지 않으니 그대로 놔두시면 되겠습니다.
오늘 주제는 사실 이미지를 흑백으로 만들기임에도 불구하고 사설이 너무 길었던 것 같습니다. 흑백으로 만드는 방법은 사실 두 가지만 알고 있으면 쉽게 만들 수 있는데요. 흑백 이미지는 RGB가 모두 동일한 숫자로 이루어져있다는 점, 그리고 그 숫자는 RGB 각각의 수를 합한 값의 평균이라는 점입니다. 이 두 가지를 알고 있다면 아래와 같이 쉽게 흑백이미지를 얻을 수 있습니다.
void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = (c.r + c.g + c.b) / 3; o.Alpha = c.a; }
오늘은 어떻게 흑백의 이미지를 만드는지에 대해서 알아보았습니다. 아래 유튜브 채널에 오시면 블로그에 포스팅된 글을 바탕으로 영상이 제작되어 업로드 되고 있으니, 영상이 필요하신 분들은 유튜브 채널에 오셔서 영상을 시청해보시면 좋을 것 같네요^^
https://www.youtube.com/channel/UC9A518WfCL5Ubh-NQ08jduw?view_as=subscriber
제로딕 코딩공부
www.youtube.com
'프로그래밍 > Unity Shader' 카테고리의 다른 글
[유니티 쉐이더 스타트업] UV가 뭘까? (0) 2019.05.28 [유니티 쉐이더 스타트업] 2개의 텍스쳐를 섞어서 출력하는 방법(lerp 함수) (1) 2019.05.21 [유니티 쉐이더 스타트업] 쉐이더 코드를 깔끔하게 정리하는법 (0) 2019.05.19 [유니티 쉐이더 스타트업] 색상을 입력 받아 출력해보기 - 2 (0) 2019.05.18 [유니티 쉐이더 스타트업] 색상을 입력받아 출력해보기 - 1 (0) 2019.05.13