전체 글 169

effective C++ - bad_alloc 에 대비하는 방법

new 로 동적메모리를 할당하려고 시도할 때, 메모리가 부족하다면 std::bad_alloc 예외를 뱉는다.아예 nullptr를 뱉어버리는 malloc 보다는 처리하기 용이한 방식이다. 그런데 new를 사용할 때 마다. try ~ catch 를 하는건 코드를 복잡하게 만들 우려가 있다. 다행히도 new가 메모리 할당에 실패하면 std::bad_alloc 뿐만 아니라 std::new_handler 라는 함수를 호출한다.이 함수는 전역적으로 관리되는 함수이며, 사용자가 직접 정의할 수도 있다. new를 실패할 시 쓰레드는 my_new_handler에서 멈춘다. 한 번쯤 고민해봤던 사항이라 유익할 것 같아서 따로 기록해둔다.

카테고리 없음 2025.06.26

Jam Engine 1차 개발 보고서

서론캡스톤 디자인 2팀의 프로젝트는 자체적으로 개발한 엔진을 이용하여 게임을 제작하는 것이다. 해당 문서는 현재까지 개발된 엔진의 기본적인 메모리 관리부터 실시간 게임 루프, 개발에 유용한 유틸리티 등을 보고한다.목차개발 환경메모리 관리레이어 기반 어플리케이션 루프Entity Component System렌더링리소스직렬화GUI 기반 에디팅 시스템빌드 시스템앞으로 남은 과제1. 개발환경주 개발 언어는 C++ 20 을 사용하고 컴파일러는 MSVC 를 사용한다. 그래픽 API로는 DirectX 11 를 사용한다. 더하여 사용한 서드파티는 다음과 같다.1) SDL3: 크로스 플랫폼 UI 및 미디어 라이브러리2) Imgui: 즉시 렌더링 GUI3) ENTT: 게임 루프 구성4) nlohmann json: JSON..

카테고리 없음 2025.06.08

뻘짓) 콘솔로 래스터라이제이션 기반 큐브 렌더링하기

한 3시간 걸린 것 같습니다.재밌네요 전체코드더보기 #include iostream>#define NOMINMAX#include Windows.h>#include cassert>#include chrono>#include vector> #define PI 3.14159265358979323846f#define DEG2RAD(x) ((x) * PI / 180.f) struct ScreenBuffer{ uint8_t* buffer; uint32_t width; uint32_t height;}; struct Matrix4x4{ float m[4][4]; static Matrix4x4 Identity() { Matrix4x4 result = {}; re..

카테고리 없음 2025.04.17

Screen Space Ambient Occulusion

그렇게 눈에 띄는 효과는 아니지만없으면 허전한게 앰비언트 오클루전 인 것 같습니다. 반구형 오프셋 커널을 만들어서현재 픽셀을 일정 오프셋만큼 이동시켜줍니다.그 다음 해당 픽셀의 깊이와 뎁스 버퍼에 저장된 깊이를 비교하여뎁스 버퍼에 저장된 깊이가 더 얕다면 오클루전 팩터에 1씩 더합니다. 이것은 현재 픽셀 주변에 나를 가리는 차폐체가 있다는 것을 의미합니다. 그렇게 게산하면 이 장면에서  이렇게 차폐 정도를 계산할 수 있습니다. 이걸 라이팅 과정에서 앰비언트 부분에 곱해주면 SSAO 완성입니다.  좌: AO 가 적용되지 않음우: AO 가 적용됨 차이가 좀 있는지요..?제 눈에는 조금 납니다  좌: AO 가 적용되지 않음우: AO 가 적용됨 현재는 샘플링수가 64, 노이즈의 크기는 4입니다. 꽤나 고품질이죠..

카테고리 없음 2025.04.14

FlatBuffers 를 이용한 모델 로딩 최적화

3D 모델을 로딩한다고 하면 일반적으로 assimp를 이용해 fbx나 obj 파일을 로딩합니다.fbx obj 의 경우 내부 데이터가 굉장히 복잡하기 떄문에 로딩하는데 다소 시간이 걸립니다. 만약 소프트웨어에서 필요한 데이터만 로딩할 수 있따면 로딩하는 시간이 훨씬 줄어듭니다. 먼저 fbx 파일을 로딩하는데 걸리는 시간을 보겠습니다.  드래곤 모델을 로딩하는데 1.586초가 소모되었습니다. 참고로 해당 모델은 약 114000 개 가량의 버텍스와 인덱스를 가지고 있습니다. 최초에는 Josn을 이용하여 버텍스(위치, 법선, 탄젠트, 비탄젠트, uv, 노말) 과 머테리얼 속성 (PBR 및 Phong, 텍스처 경로)를 저장했는데, 커스텀 타입의 저장 및 불러오기 시간이 과하게 많이 걸렸습니다. (파일 크기도 크구..

카테고리 없음 2025.04.05

Fast Approximate Anti-Aliasing

결과 먼저 확인하겠습니다.  1: X2: 품질 중3: 품질 상 참고 문헌https://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf FXAA는 준수한 성능을 보이면서 매우 성능이 좋은 안티에일리어싱 기법입니다.FXAA는 LDR로 변환된 후의 디스플레이용 sRGB 색 공간에 적용하라고 합니다. 즉 HDR -> LDR의 톤매핑 적용 후 이미지필터처럼 적용하는 것이지요 HDR 이미지에 바로 FXAA를 적용하면 제대로 적용되지 않는다고 합니다.아무래도 FXAA는 광도와 휘도를 이용하는 알고리즘에다가 [0, 1] 범위에서 동작하는 것을 전제로하기에 [0, ~] 의 범위를 가지는 HDR에서는 안티에일리어싱이 적용되지 않은 ..