전체 글 80

NHN게임 공채 코딩테스트 pre-test 1차 불합 후기

NHN 게임 공채에 서류 전형을 통과한 뒤, 코딩테스트를 준비하며 알고리즘 공부를 했습니다. 몇가지 기억에 남는 몇 가지를 후기로 정리해 봅니다. 1. IDE 환경의 아쉬움코딩테스트가 프로그래머스에서 진행되다 보니 평소에 익숙하게 사용하던 Rider를 쓸 수 없었던 점이 정말 아쉬웠습니다. 처음에는 Rider에서 문제를 풀고 결과를 복사해서 제출하는 방식으로 연습했는데, 막상 실전에서는 프로그래머스 웹 에디터에서 바로 코딩하려니 불편한 점이 많았습니다.특히, 자주 쓰던 라이브러리의 스펠링이 헷갈리거나, Rider에서 자동으로 잡아주던 오류나 using문을 직접 처리해야 하는 부분에서 손이 많이 갔습니다. IDE에 많이 의존하고 있었던 걸 다시 느꼈고, 환경에 적응하는 연습이 필요하겠다는 생각이 들었습니다..

Etc 2025.08.27

Lit Shader 제작 복습

지금까지 공부해온 것들을 복습하면서 Lit Shader를 만들어보자.1. Lambert(Diffuse)빛을 받아오는 기본적인 계산 2. 환경광 및 환경차폐(Ambient, Ambient Occlusion)환경에 반사된 빛에 대한 추가적인 빛과 가려짐에 의한 환경차폐 (AO 맵 활용) 3. 퐁 반사(Specular)빛의 정면일수록 빛나는 하이라이트 4. 프레넬 반사(Rim)바라보는 방향에 수직일때 나오는 빛 5. Fake Specular프레넬을 이용한 하이라이트로, '내가 바라보는 방향에 하이라이트'를 주어 빛의 영향이 없는 뒷면에서도 보인다. 음영지역에서도 음영과 질감을 좀 더 잘 보이게 하는 장점이 있다. 그리고 셰이더는 보기 좋은게 좋은것이다~.문제발생회색 돼지가 나와버린다?!원인 분석 빛 해결결과물..

셰이더 2025.08.18

오픈월드 게임의 월드 관리 방식과 시간 처리

나는 유튜브중 100일 챌린지를 하는 유튜버 '치랜'을 좋아한다. 그 중, 좀보이드 영상을 보는데 갑자기 이런 생각이 들었다.“이렇게 넓은 맵을 하나의 씬(Scene)으로 다 담아두는 걸까?아니면 여러 개의 씬을 나누어, 플레이어 주변만 활성화하는 걸까?” "전기가 끊기고 시간이 지나면 '신선한' 음식들은 '상한' 음식이 되어버린다. 비활성화 된 혹은 현재 없는 씬에 존재하는 음식들에게도 전기가 끊기고 시간이 지났다는 메시지를 보낼 수 있는 걸까?1. 방대한 월드, 어떻게 관리할까?오픈월드 게임을 하나의 씬으로 통째로 유지하는 것은 메모리와 성능 부담이 크다.그래서 대부분의 게임은 스트리밍(Streaming) 기법을 사용한다고 한다. (ChatGPT 피셜)플레이어 주변은 활성화된 게임 오브젝트로 유지조금..

Unity 2025.08.13

스페큘러 라이트 (퐁 반사)

자동차를 보면 빛이 닿는 부위는 다른 부위보다 더 하얗게 나온다.스페큘러 표현 공식 중 가장 전통적인 표현방식은 퐁 반사(Phong Reflection)이다. 기본원리는 '내가 보는 방향으로부터 반사된 방향에 조명이 있으면 그 부분의 하이라이트가 가장 높다'에서 출발한다. 이 하이라이트의 수학 공식은 '조명벡터(L)를 노말 방향(N)을 기준으로 반사하는 반사벡터(R)와 시선벡터(V)의 내적으로 스페큘러가 표현된다'이다.L 벡터를 기반으로 R벡터를 계산하려면 2R = 2N(L·N) - L 공식으로 계산해야 한다. James F. Blinn이 이를 좀 더 간략화한 공식을 만들었고 이것이 블린-퐁 공식이다. 블린-퐁 공식은 '시선벡터(V)와 조명벡터(L)의 중간 값인 '하프벡터(H)'를 구하고, 이를 노말 벡..

셰이더 2025.08.11

다가가면 홀로그램이 켜지도록 하는 간단 스크립트

다가가면 홀로그램이 켜지고, 멀어지면 홀로그램이 꺼지는 간단한 스크립트를 만들어보자. 1. 플레이어플레이어는 다음과같이 만들었다.Player (총괄, 초기화 담당)PlayerController (실질적임 움직임 담당)InputController (인풋시스템의 인풋을 벡터로 변환하여 전달하는 역할) 인풋시스템을 이용하여 wasd로 이동, space로 점프하는 간단한 스크립트이다.using UnityEngine;public class Player : MonoBehaviour{ private PlayerController controller; private void Awake() { controller = GetComponent(); controller.Init(); ..

Unity 2025.08.08

홀로그램 만들기

지난번 Fresnel로 주변이 은은하게 빛이나는 이펙트를 만들었다. 이번엔 이걸 이용하여 홀로그램뼈를 만들어보도록 하자. 1. 홀로그램처럼 만들기그래픽 세팅의 Surface Type을 Transparent로 지정하고 색상에 초록색(홀로그램 색)을, 알파값에는 Fresnel Effect 노드를 연결하였다. 2. 깜박임 부여하기halfLambert는 *0.5 + 0.5한 값으로 -1 ~ 1사이인 sin값을 0 ~ 1로 자연스럽게 옮기는 역할이다. 2-2. 자연스러운 깜박임으로 바꾸어보자홀로그램을 생각해보면 깜박일때 어두어지는 부분이 적고 밝을때가 긴 경우가 더 많은것같다. 이를 수정하고자해도 현재는 sin 그래프에 의한 밝기 조절이므로 새로운 커브를 만들고 이를 받아 값이 변하게 해보도록 한다.using ..

셰이더 2025.08.07

Reloading Domain

작업을 하다보면 이 Reloading Domain을 기다려야 하는 시간이 있다.나는 거의 새로운 프로젝트에서 셰이더를 공부하기위해 셰이더 관련 몇몇 에셋만을 사용하고있다. 그런데 이 오류가 갑자기 생겨났고 6분이상 기다려도 해결되지 않아 강제 종료 시켜버렸다. 그래서 이 Reloading Domain이 무엇인지, 그리고 어떻게 해결해야 하는지 찾아보고자 한다. 1. Reloading Domain우선 유니티의 도메인은 .NET의 AppDomain 개념을 기반으로 하고있다. 유니티가 컴파일 후 변경된 어셈블리를 반영하려면 기존 AppDomain을 언로드하고, 새로운 도메인을 생성해야한다. 이 AppDomain을 언로드하면 해당 도메인 내의 모든 static 객체, 이벤트, 리소스, 메모리가 정리되어 stat..

Unity 2025.08.07

Fresnel 구현하기

위 사진의 x축은 내가 물체를 바라보는 각도이고 각 그래프는 재질에 따른 반사율을 나타낸다.물체와 90도 각도로 바라볼수록 재질에 상관없이 많은 빛이 반사됨을 알 수 있는데 이러한 반사 공식을 Fresnel(프레넬)이라고 한다. 게임에서는 배경과 캐릭터의 분리나 강조를 위해, 혹은 선택되었을 때나 특이한 상태를 표현하기 위한 이펙트 또는 툰 셰이딩 효과 같은 특수한 효과를 위해 이 효과를 과장되게 사용한다고 한다. 1. Fresnel의 구현기존에 했던 NdotL은 조명의 방향과 노멀벡터를 연산한 결과였다. 이번엔 조명대신 View Direction을 이용해보자.- 노멀벡터와 View Direction을 내적한다. 카메라의 방향일수록 밝아지고 반대쪽은 어두워진다. (카메라가 조명처럼 취급된다)- o..

셰이더 2025.08.05

Simple Lit 셰이더 만들기(2)

1. Normal Map 추가하기질감을 추가해줄 노멀맵을 추가한다노멀맵은 메쉬를 그대로 둔 채 법선의 방향을 조절하여 울퉁불퉁한 질감을 만들어낸다. 노멀벡터대신 노멀맵을 사용함으로써 자연스러운 울퉁불퉁한 모양이 된다.2. Albedo 텍스쳐 추가하기알베도 텍스쳐는 그 물질의 색을 나타내는 텍스쳐이다.NdotL (normal dot light, 램버트 조명 결과)를 이에 곱해줌으로써 방향에 따라 그 물체의 색이 변하는걸 연산해준다. 3. 조명 색 받아오기우선 CustomLight 코드에서 Output으로 Vector3값인 Color 변수를 추가한다.#ifdef SHADERGRAPH_PREVIEWDirection = float3(1,1,1);Color = float3(1, 1, 1);#elseLight li..

셰이더 2025.08.04

Simple Lit 셰이더 만들기(1)

1. 자료 준비 2. 머터리얼 및 셰이더그래프 생성당연히 Unlit(빛 연산x)을 적용시켜 아무것도 보이지 않는다. 3. 커스텀 노드로 Light Vector 받아오기빛을 연산하기 위해 light vector를 가져오려해도 해당 노드는 없다.따라서 Custom Function으로 빛을 받아오도록 하자. 3-1. Custom FunctionCustom Function은 HLSI 코딩으로 노드에 없는 기능을 작성하는 노드이다. Input은 없으며GetMainLight() 함수에서 Light 구조체를 light라는 이름으로 받고 이 구조체의 direction 값을 Direction에 넣어 output으로 내보낸다. Direction은 Vector3다. 현재 색은 Direction에 연결되어 있다. 따라서 빛의..

셰이더 2025.07.30