Memo [1] float 32비트 유효 숫자 : 6자리 실수 중 정확도가 가장 높다. 실수 중 연산이 가장 느리다. 정확해야 하는 경우, 대개 사용된다. 예시 : 정점 위치, UV, 복합 스칼라 연산 [2] half 16비트 유효 숫자 : 3자리 표현 범위 : -60...
유니티 - Vert/Frag 쉐이더에서 Receive Shadow, Cast Shadow 구현하기
Surface Shader 쉐이더를 빠르게 작성할 수 있도록 다양한 편의를 제공한다. Surface 쉐이더 함수는 #pragma surface Surface쉐이더함수명으로 등록한다. 미리 만들어진 라이팅을 간편히 적용할 수 있다. 커스텀 라이트를 작성하는 것도 어렵지 않다. Receive Shadow, Cast Shadow는 자...
C# - 배열 내부를 같은 값으로 채우기
Memo // 인덱스 0부터 99까지 정수 1로 채우기 int[] arr = Enumerable.Repeat(1, 100).ToArray(); 물론 LINQ를 쓰는 만큼, 중간 버퍼의 가비지는 감안해야 한다. .NET 5.0 버전이라면 Array.Fill() 메소드를 사용하면 된다. int[] arr ...
유니티 - 컴퓨트 버퍼를 통한 GPU 인스턴싱
GPU Instancing [1] 컴퓨트 버퍼 - 메시 데이터 그려낼 메시의 정보를 컴퓨트 버퍼에 저장한다. 컴퓨트 버퍼의 stride는 4 byte(sizeof(uint))이다. 컴퓨트 버퍼의 크기는 20 byte(uint 5개)이며, 각각의 데이터는 메시에 대한 정보를 담고 있다. Mesh mesh; ...
Raycast to Plane
레이캐스트(Raycast) 공간 상의 한 점에서부터 목표 지점까지 가상의 광선을 발사하여, 광선에 닿는 물체의 표면을 검출한다. 평면(Plane) 평면 위의 점 P와 평면의 법선 벡터 N을 알고 있으면 평면을 정의할 수 있으며, 평면 위의 임의의 점 X를 가정하여 dot(N, P - X) = 0을 통해 평면의 방정식을 정의할 ...
Raycast to Sphere
레이캐스트(Raycast) 공간 상의 한 점에서부터 목표 지점까지 가상의 광선을 발사하여, 광선에 닿는 물체의 표면을 검출한다. 직선과 구체 표면의 접점 찾기 시작 지점에서부터 목표 지점으로 광선을 발사하여, 두 점이 이루는 직선과 교차하는 구체의 표면 지점을 찾아낸다. 3차원에서 수행하면 구체, 2차원에서 수행하면 원(C...
C# - 바이트 버퍼를 읽어서 구조체로 변환하기
소스 코드 메소드 /// <summary> 바이트 버퍼를 읽어서 구조체로 변환하기 </summary> public static T? ByteBufferToStruct<T>(byte[] buffer, int offset) where T : struct { int size = Mar...
유니티 쉐이더 - 빌보드(Vert/Frag)
1. 일반 struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; float2 uv : TEXCOORD0; }; float4 Billboard(float4 ve...
C# Nullable
null 허용 값 타입 .Net Framework 2.0 버전부터 사용할 수 있다. Nullable<T> 또는 T? 꼴로 사용할 수 있다. null 값의 초기화를 허용한다. null을 허용한다고 해서 참조형이 되는 것은 아니고, 값 타입은 그대로 값 타입이다. ...
유니티 - sRGB, Linear, Gamma 컬러 스페이스
모니터의 색상 변환 모니터는 디스크에 저장된 이미지를 화면에 출력할 때 Pow(color, 2.2) 연산을 적용해서 더 어둡게 출력한다. 이유? 베버의 법칙(Weber’s law) 사람의 시각은 어두운 부분의 밝기 변화를 부드럽지 않고 단절되게 감지한다. 그래서 어두운 부분의 화질이 떨어져...