본문 바로가기

셰이더 (Shader)89

[Unity/Shader] 파트16-2 : 반투명 (알파 블렌드 Alpha Blend) 이전에 배운 내용 게임 오브젝트들을 그리는 순서는 정해져 있지 않다. 오브젝트가 그려질 때마다 z버퍼를 참고로 앞 뒤 판정한 후 그려진다. 반투명일 때는? 앞에 있는 반투명 오브젝트가 먼저 그려지고, 뒤에 있는 불투명 오브젝트가 그려지는 경우 문제가 생긴다. 지워지지 않아야할 부분까지 지워진다. (아래 그림 참고) 해결법 1. 불투명 오브젝트는 먼저 그린다. 2. 반투명 오브젝트는 나중에 그린다. 하지만 여기까지만 하면 반투명끼리의 문제는 해결되지 않는다. 3. 반투명끼리는 멀리 있는 것부터 차례대로 그린다. 누가 멀리 있는지 오브젝트끼리 거리를 잰다. 이것들을 정렬한다. 이것을 알파 소팅이라고 한다. 반투명 그리기의 문제점 1. 불투명 오브젝트 다 그려질때까지 대기해야한다. 2. 반투명끼리의 거리 연산.. 2023. 8. 23.
[Unity/Shader] 파트16-1 : Z 버퍼 매 프레임마다 배경, 캐릭터, 이펙트, UI가 모두 그려지는 과정이 있다. 가장 먼저 그려지는 것은? 먼저 계산이 끝난 녀석부터 그린다. 뒤에 있는 물체 앞에 물체가 덧 그려지면 이를 오버드로우라고 한다. 그러나 앞에 있는게 먼저 그려지고 뒤에가 그려지면 문제가 생긴다. 그래서 앞에 그려져 있는게 누구인가 라는 정보가 필요하다. 그 정보는 픽셀 단위로 존재한다. 앞뒤 판정을 위해, 각 픽셀마다 카메라 기준으로 가장 가까운 오브젝트의 깊이값이 저장되어 있는 데이터 시트가 필요하다. 이 깊이값을 Z 버퍼라고 부른다. 그래픽 카드는 여러 버퍼를 렌더링하고 있다. 눈에 보이지 않지만, 그림으로 그려서 가지고 있는 것을 버퍼라고 한다. 뒤 오브젝트가 나중에 그려져도 앞 오브젝트가 미리 써놓은 Z 버퍼값을 참조해 .. 2023. 8. 23.
[Unity/Shader] 파트15-2 : Normalmap이 적용된 Cubemap 일반적인 노말맵 적용 방식을 사용하면 에러가 난다. 그 이유는 '버텍스 월드 노말'과 '탄젠트 노말인 UnpackNormal 함수를 거친 노말'을 surf 함수 내부에서 같이 사용하였기 때문이다. 따라서 좌표계를 월드로 통일하여 계산한다. 코드 Shader "Custom/part15-2" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _BumpMap ("NormalMap", 2D) = "bump" {} _Cube ("Cubemap", Cube) = ""{} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert noambient #pragm.. 2023. 8. 23.
[Unity/Shader] 파트15-1 : Cubemap 적용 Cubemap이란? Cubemap은 일종의 텍스쳐다. 텍스쳐 한 장으로 사방향을 모두 표현하는 특수한 텍스쳐다. 환경 텍스쳐를 이용해 반사를 표현한다. 1. 주변 이미지를 텍스쳐로 만든다. 2. 이를 오브젝트에 씌운다. Ambient Cube Cubemap은 반사 표현시도 쓰이지만, Ambient Color(환경광)기능을 개선하기 위해서도 사용한다. 큐브맵 사이즈를 극도로 줄인다. 이걸 입혀 산란광을 표현한다. 이를 Ambient Cube라고 부른다. 이렇게 이미지를 이용해 조명 표현하는 방식을 IBL (Image Based Lighting)이라고 한다. 코드 Shader "Custom/part16-1" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {.. 2023. 8. 22.
[Unity/Shader] 파트14-8 : Diffuse Wraping 기법 응용 라이트벡터와의 내적은 x축으로 사용한다. (디퓨즈로 표현) 뷰벡터와의 내적은 y축으로 사용한다. (스펙큘러로 표현) 추가정보 도타2 창작마당의 쉐이더 가이드에 여러 응용법들이 있다. 라이트벡터와의 내적이 아닌, Normal.x 또는 viewDir.y 등을 사용하여 재밌는 표현이 가능하다. 텍스쳐 세팅 텍스쳐의 y축에 스펙큘러 색인 흰, 검을 할당하였다. 툰이므로 단절되게 할당하였다. 코드 Shader "Custom/part14-7" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _BumpMap ("NormalMap", 2D) = "bump" {} _RampTex ("RampTex", 2D) = "white" {} } SubShader { Tags .. 2023. 8. 22.
[Unity/Shader] 파트14-7 : Diffuse Wraping 기법 팀포트리스2에서 사용된 Wrapped Diffuse 기법에 대해 알아본다. 가볍고 응용이 편리하다. 지금도 많이 사용한다. 노멀과 라이트 벡터의 내적값을 UV로 사용하는 기법이다. 텍스쳐 세팅 Clamp : 마지막 색상이 처음 부분에 묻어나는 문제를 방지한다. None : 압축하면 컬러의 손실이 생길 수 있다. 따라서 압축 해제하여 방지한다. 코드 Shader "Custom/part14-7" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _BumpMap ("NormalMap", 2D) = "bump" {} _RampTex ("RampTex", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque".. 2023. 8. 22.
[Unity/Shader] 파트14-6 : Fresnel 이용해 외곽선 만들기 pass는 한 개만 이용한다. 이전 챕터에서 실습한, 끊어지는 음영 부분의 패스만 남긴다. 내적을 한 후, if문으로 외곽선으로 만든다. 코드 Shader "Custom/part14-6" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _BumpMap ("NormalMap", 2D) = "bump" {} // 노말맵 받기 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 cull back CGPROGRAM #pragma surface surf Toon #pragma target 3.0 sampler2D _MainTex; sampler2D _BumpMap; struct Input { float2 uv_Mai.. 2023. 8. 22.
[Unity/Shader] 파트14-5 : 끊어지는 음영 만들기 if문을 이용해 끊어지는 음영을 만든다. ceil 함수를 이용해 더 가볍게 만들 수 있다. 하지만 범위를 마음대로 설정할 수 없는 단점이 있다. 코드 Shader "Custom/part14-5" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _BumpMap ("NormalMap", 2D) = "bump" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 cull front // 1st pass 검은색 출력 CGPROGRAM #pragma surface surf Nolight vertex:vert noshadow noambient #pragma target 3.0 sampler2D _MainTex; .. 2023. 8. 20.
[Unity/Shader] 파트14-4 : 버텍스 쉐이더를 이용한 오브젝트 확장 버텍스 쉐이더를 사용해본다. 버텍스를 노말 방향으로 이동시키는 것이 핵심이다. 코드 Shader "Custom/part14-4" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 cull front // 1st pass 검은색 출력 CGPROGRAM #pragma surface surf Nolight vertex:vert noshadow noambient // vertex:vert 버텍스 쉐이더가 vert라는 함수 이름으로 가동된다는 것을 알려준다. // 라이팅 연산을 최소화하여 가볍게 만든다. #pragma target 3.0 sampler2D _MainT.. 2023. 8. 20.