본문 바로가기

분류 전체보기414

[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.
[Unreal/Niagara] 시간에 따라 파티클 색상 변경 보라 -> 분홍으로 바뀌는 결과이다. 방법 1. lerp를 사용한다. 2. 컬러 지정이 쉽게 linear color rgb를 적용한다. 3. 알파에 커브를 적용해 컨트롤 한다. 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.
[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.