목록전체 글 (58)
MOONSUN
이전 글에서도 그렇고, Dynamic Programming 문제를 해결할 때의 핵심은 "점화식"을 찾는 것이었다. 하지만 DP 문제를 풀다 보면점화식은 맞는 것 같은데 시간 초과가 나거나, 배열 크기를 키우면 메모리가 터지고,경우의 수를 세려다 숫자가 감당할 수 없이 커지는 문제를 맞이하게 된다. 문제는 점화식이 아니라, 불필요한 정보까지 상태로 들고 가고 있다는 점이다. 이번 글에서는 “모든 경우를 그대로 저장하면 왜 안 되는지”를 출발점으로,미래 계산에 꼭 필요한 정보만 남기는 상태 압축과 그 상태에서 자연스럽게 점화식을 도출하는 과정을 정리해보고자 한다. 1. 1차원 DP와 2차원 DP 1차원 DP : 결과를 정의하는 데 정보가 하나면 충분한 경우2차원 DP : 결과를 정의하려면 두 가지 정보가..
연기는 단순한 텍스처 애니메이션으로는 잘 표현되지 않는다.실제 연기는 형태가 끊임없이 변하고, 흐르고, 말리며, 사라진다 등.. 의 움직임이 있다. 이번 글에서는 이전 글에서 알아보았던 Noise → FBM → Domain Warping 구조를 기반으로,텍스처 없이 연기의 움직임을 표현한 Procedural Smoke Pixel Shader 구현 과정을 정리해보려고 한다. Domain Warping의 핵심 아이디어노이즈로 좌표를 왜곡하고,왜곡된 좌표에서 다시 노이즈를 샘플링한다. 이 구조를 토대로 구현해보았다. 0. 개요텍스처나 시뮬레이션 데이터를 사용하지 않고,수학적 함수(Noise)와 시간(Time) 만으로 연기의 형태와 움직임을 생성하는 것을 목표로 했다. 핵심 아이디어는 다음과 같은 흐름..
자연스러운 구름, 연기, 물결 같은 패턴은사진을 찍어서 만드는 것이 아니라 수학적 규칙으로 생성할 수 있다.이런 방식을 Procedural Texture라고 부른다. 그 핵심 흐름은 단 하나다.Noise → FBM → Domain Warping 1. Noise란 무엇인가? Noise = “연속성을 가진 랜덤” Noise는 단순한 난수가 아니라, 이웃한 위치끼리는 비슷한 값을 갖는 랜덤이다. 랜덤(Random):각 위치마다 완전히 다른 값점처럼 튀고 끊김노이즈(Noise):근처 위치는 비슷한 값부드럽게 이어짐 시각적인 느낌으로, Random은 TV 화면의 지글지글한 점이고, Noise는 구름이나 물결 같은 부드러운 변화의 느낌이다. Noise는 자연스러운 변화의 최소 단위다. 1-1. Noise는 ..
지금까지 QuadTree와 BVH 에 대해서 각각 알아보았는데,그럼 각각은 어떤 차이점이 있고, 또 각각은 어디에서 사용하면 되는건지 정리해보고자 한다. Quad/Octree는 공간을 기준으로 나눈다.BVH는 객체(AABB)를 기준으로 묶는다. 구분Quad/OctreeBVH분할 기준공간을 일정 규칙으로 고정 분할객체(primitive)의 분포에 따라 적응적 분할트리 생성 방식공간 기반객체 기반노드 크기고정된 공간 분할 규칙 기반객체들의 AABB의 합집합노드 수공간 크기·해상도에 영향객체 배치에 따라 동적으로 결정 1. 장점 BVH의 장점 1. 객체 밀도에 따라 자동 적응비어 있는 공간을 거의 생성하지 않음객체 밀집 지역만 세분화 → 트리 깊이가 효율적 2. Ray Tracing 에 매우 유리각 노..
LDR(Low Dynamic Range)와 HDR(High Dynamic Range)는 렌더링에서 서로 다른 밝기 표현 방식을 의미한다. 두 용어는 종종 단순한 화질 차이처럼 사용되지만, 실제로는 픽셀 값의 범위, 계산 방식, 그리고 디스플레이로 전달되는 출력 경로까지 서로 다른 전제를 가진다. 이번 글에서는 LDR 렌더링이 가지는 한계부터, HDR 렌더링이 왜 필요해졌는지, 그리고 HDR 파이프라인이 어떤 단계들로 구성되는지를 알아보려고 한다. HDR 렌더링 파이프라인은 다음 순서로 이해하면 된다. 현실적인 밝기 계산 ↓HDR 렌더타겟 (밝기 차이를 자르지 않음) ↓노출 (전체 밝기 위치 조정) ↓톤 매핑 (사람 눈에 맞게 압축) ↓백버퍼 + Color Space 설정 ↓모니터 출력이제 각 단계를 ..
PBR + IBL 환경을 구현 한 후, 머티리얼 값을 수동으로 조절하면서 구현이 잘 되었는지 확인중이었는데, 이상한 현상 발견. 문제 상황 : IBL Specular가 거칠기에 따라 뭉게지지 않는 문제 Metallic = 1Roughness를 0 → 1로 점점 증가 정상적인 경우라면 거칠기가 커질수록 환경 반사가 점점 뭉게지고 흐려져야 하는데,반사가 뭉게지지 않고, 색이 조금 밝아질 뿐 거칠기 변화가 시각적으로 거의 느껴지지 않음 즉, 물리적으로 올바르지 않은 IBL Specular 결과가 나오고 있었다. 셰이더 코드를 잘못 작성한줄 알고 며칠동안 들여다 봤지만, 원인을 발견 못했는데,, 설마하고 샘플러 초기화 부분을 확인해봤는데 샘플러 초기화가 잘못되고 있었음..!! 내가 사용 중이던 샘플러..
앞 글에서 동적 프로그래밍에 대해 알아보았었다. 이번 글에서는 동적 프로그래밍을 활용해서정수 N을 1로 만드는 최소 연산 횟수 문제를 간단하게 구현해보도록 하자! 0. 문제 정의정수 N이 주어졌을 때, 다음 세 연산만을 사용하여 N을 1로 만드는 최소 연산 횟수를 구하는 문제를 해결해보자. N이 3으로 나누어 떨어지면 → N = N / 3N이 2로 나누어 떨어지면 → N = N / 2항상 가능 → N = N - 1목표는 연산 횟수를 최소화하는 것 !! 핵심 포인트: 여러 선택지 중에서 최소 횟수를 선택해야 하는 최적화 문제 이 문제는 중복되는 계산이 많기 때문에 동적 계획법(DP)이 적합한 문제다. DP를 적용하면 작은 문제부터 큰 문제까지 최적해를 점차 만들어 나갈 수 있다. DP 방식은 두 ..
복잡해 보이는 문제도 작은 문제로 나누어 효율적으로 해결하는 방법이 있다.바로 동적 프로그래밍(Dynamic Programming, DP)이다.DP는 문제를 여러 개의 작은 부분 문제로 분해하고,이 부분 문제들의 결과를 저장해 재사용함으로써 중복 계산을 제거하는 알고리즘 기법이다.일반적인 재귀나 완전 탐색으로는 시간 제한을 넘길 수 있는 문제들도, DP를 사용하면 빠르게 해결할 수 있기 때문에 알고리즘 분야에서 매우 중요한 개념이다.이 글에서는 동적 프로그래밍의 개념에 대해 알아보고, 예시 코드 구현까지 작성해 보도록 하자. 0. Dynamic Programming(DP : 동적 프로그래밍)동적 프로그래밍(Dynamic Programming, DP)은큰 문제를 작은 부분 문제(Subproblem)로 ..
IBL (Image Based Lighting) 은 환경 HDR 한 장으로 간접광을 만드는 기술이다. 실시간 렌더링에서 현실적인 Global Illumination(간접광) 을 표현하기 위한 가장 핵심적인 요소이며,현대 PBR(Pysically Based Rendering)에서 빠질 수 없는 기본 조명 시스템이다. 이전 글에서는 PBR의 원리와 조명 모델에 대해 정리했는데,이번 글에서는 그 PBR의 기반이 되는 환경 기반 간접광, 즉 IBL이 어떻게 구성되고 동작하는지 자세히 알아보도록 하겠다. 01. 조명의 두 종류 : Local vs Global Illumination Local Illumination “직접 오는 빛(Direct Light)”만 계산단 한 번의 bounce점광/스팟/직사광 같..
이전에 BVH (Bounding Volume Hierarchy) 에 대해서 간단하게 정리 해봤었는데,이번에는 BVH를 구현할 때, 오브젝트가 움직였을 때 트리를 어떻게 다시 맞춰서 업데이트할 것인지에 대한 방법에 대해서 알아보고자 한다. 0. BVH의 트리 품질 (Tree Quality) BVH는 오브젝트들의 AABB를 이용해 트리(계층적 경계 볼륨)를 만드는 구조이다.문제는 오브젝트가 움직이면, 트리의 품질이 떨어지기 때문에 ‘트리를 어떻게 갱신할 것인가’ 가 중요해진다. 여기서 갱신 방식이 정적(Static) 과 동적(Dynamic) 으로 나뉜다. 0-1. “오브젝트가 움직이면 트리의 품질이 떨어진다”는 말은BVH가 더 이상 ‘빠르게 충돌 검사/레이 테스트를 해 줄 수 없는 구조가 되어간다는 뜻...