본문 바로가기

셰이더 (Shader)89

[Unity/Shader] 파트18-5 : Matcap Matcap은 Material Capture의 준말이다. 텍스쳐를 이용해 조명을 대신하는 방식이다. ViewDir을 기반으로 구현한다. Matcap 텍스쳐를 사용하기 위한 UV를 연산하는 것이 핵심이다. 뷰 노말을 UV로 사용한다. 코드 Shader "Custom/part18-5" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _Matcap("Matcap", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #.. 2023. 10. 12.
[Unity/Shader] 파트18-3 : 디졸브 코드 Shader "Custom/part13-3 1" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _NoiseTex ("NoiseTex", 2D) = "white" {} _Cut ("Alpha Cut", Range(0,1)) = 0 [HDR]_OutColor("OutColor", Color) = (1,1,1,1) _OutThickness("OutThickness", Range(1,1.5)) = 1.15 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 200 CGPROGRAM #pragma surface surf Lambert alpha:fade #pragma .. 2023. 10. 10.
[Unity/Shader] 파트18-2 : 로봇 눈 깜빡이기 (Ramp 텍스쳐 사용) 아래와 같은 램프 텍스쳐를 제작해 깜빡임에 사용한다. sin보다 불규칙한 패턴을 표현하는데 좋다. 텍스쳐 용량은 작아야하므로 128x2를 사용한다. 코드 Shader "Custom/part18-2" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _MaskTex ("Mask", 2D) = "white" {} _RampTex ("Ramp", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert #pragma target 3.0 sampler2D _MainTex; sampler2D _MaskTex; sampler2.. 2023. 9. 6.
[Unity/Shader] 파트18-1 : 2Pass를 이용한 깨끗한 알파 블렌딩 (뒷면이 안보이게) z버퍼에 그리는 것과, 화면에 그리는 것을 별도로 분리해 계산한다. 이를 통해 반투명의 뒷면이 안보이게 하는 방법이다. 코드 Shader "Custom/part18-1" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 // 1st pass : Z 버퍼에는 그리되, 화면엔 그리지 않는다. zwrite on ColorMask 0 // 화면에 그리지 않게 한다. CGPROGRAM #pragma surface surf nolight noambient noforwardadd nolightmap novertexlights noshadow #pragma target 3.. 2023. 9. 4.
[Unity/Shader] 파트17-2 : 블렌드 펙터 연산 개요 중요한 기본 공식은 다음과 같다. (펙터 * Source) + (펙터 * Destination) 이펙트를 예로 들어보자. 자신을 Source라고 부른다. (Src) 배경을 Destination이라고 부른다. (Dest) 예시 1. SrcAlpha OneMinusSrcAlpha (알파 * Source) + (1-알파 * Destination) 2. SrcAlpha One 배경은 그대로 사용되므로 겹쳐서 밝아진다. (알파 * Source) + (1 * Destination) 3. One One 알파 채널이 전혀 작동하지 않는다. (1 * Source) + (1 * Destination) 4. DstColor Zero 결론적으로 색상끼리의 곱셈이다. (배경색상 * Source) + (0 * Destina.. 2023. 8. 30.
[Unity/Shader] 파트17-1 : 커스텀 제어 가능한 알파 블렌딩 모든 문제가 발생하는 전형적인 알파 블렌딩 쉐이더이다. 단, 명시적으로 선언된 부분만 다르다. 명시적으로 선언된 부분은 다음과 같다. 1. z 버퍼에 쓸 것인지 여부 2. 블렌드 펙터로 블렌딩을 제어 코드 Shader "Custom/part17-1" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } // * zwrite off // zwrite 끄고 켜기 옵션 blend SrcAlpha OneMinusSrcAlpha // blend 펙터 LOD 200 CGPROGRAM #pragma surface surf Lambert ke.. 2023. 8. 30.
[Unity/Shader] 파트16-5 : 알파 테스팅 (컷아웃) 알파 테스팅(컷아웃)은 나무나 풀 등을 그릴 때 사용한다. _Cutoff 프로퍼티는 잘라내는 기준이 될 값이다. 단, 잘라내면 외곽이 거칠어지는 문제가 있다. 안티알리아싱으로 개선한다. 또는 해상도가 높은 텍스쳐를 사용해서 덜 거슬리게 한다. 코드 Shader "Custom/part16-5" { Properties { _Color ("Color", Color) = (1,1,1,1) // _Color가 없으면, 그림자가 나오지 않는다. 그림자를 그리는 Pass에서 그림자 색상을 위해 이 인자를 사용하기 때문이다. _MainTex ("Albedo (RGB)", 2D) = "white" {} _CutOff ("Alpha cutoff", Range(0,1)) = 0.5 // * } SubShader { Tags.. 2023. 8. 30.
[Unity/Shader] 파트16-4 : 알파 소팅 문제 로봇에 알파 블랜딩 적용한다. cull on (양면)을 끄고 cull back으로 바꾼다. 그래도 위처럼 뒤에 가려져야 할 오브젝트가 앞에 찍히는 문제가 있다. 왜 그런가? 피봇을 중심으로 거리를 산정하는 특성 때문이다. 아래 그림처럼 오브젝트와의 거리는 피봇으로 판별한다. 오브젝트 크기가 극명하게 다르면 더욱 자주 발생하는 문제다. 아래 그림에서 우측은 바닥의 피봇이 카메라와 더 가까워서 생긴 문제다. 위 내용을 정리하자면, 알파 소팅을 써도 완벽한 앞 뒤 판정은 불가능하다. 이렇듯 앞 뒤 판정이 잘못된 경우에, 자기 자신을 잘라버리는 현상을 막기 위해 z 버퍼에 자신의 위치값을 입력하지 않는다. 이를 'zwrite를 off한다' 라고 한다. 따라서 앞뒤 연산이 잘못되어도 잘리지 않고, 앞뒤만 바뀌게 .. 2023. 8. 28.
[Unity/Shader] 파트16-3 : 알파 블렌딩 제작 알파 블렌딩을 실습한다. 반투명을 만드는 것이다. 풀은 예시일 뿐이다. 실제로 반투명을 풀에다 적용하진 않는다. (풀은 보통 AlphaTest (Cutout)을 사용한다.) 코드 Shader "Custom/part16-3" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent"} // Queue는 그리는 순서를 의미한다. Transparent라고 적으면 불투명 다음에 그린다는 의미다. cull off // 양면 LOD 200 CGPROGRAM #pragma surface surf Lambert alpha:fade // * #pragm.. 2023. 8. 25.