전체 글
[자료구조] 스택
1. 스택이란? 책상에 쌓여있는 책, 창고에 쌓여있는 상자등이 스택의 전형적인 예이다. 새로운 상자를 쌓을 때는 상자더미의 맨 윗부분에 놓을 것이고, 상자가 필요하면 상자더미의 맨 위에 있는 상자를 꺼낼 것이다. 만약 중간에서 상자를 꺼내면 전체 상자 더미가 붕괴될 것이다. 따라서 가장 최근에 들어온 상자가 가장 위에 있게 되고, 또 먼저 나가게 된다. 이런 입출력 형태를 후입선출(LIFO : Last-In First-Out)이라고 한다. 스택에서의 입출력은 맨 위에서만 일어나고 스택의 중간에서는 데이터를 삭제할 수 없다. 위 그림처럼 스택에서 입출력이 이루어지는 부분을 스택 상단(stack top)이라 하고 반대쪽인 바닥부분을 스택 하단(stack bottom)이라고 한다. 스택에 저장되는 것을 요소(..
[DirectX 11] 파티클 시스템
개발 일자 : 2022년 3월 14일 ~ 18일 현재 제작 중인 일본 테마의 맵 중앙에는 이렇게 큰 냄비와 모닥불이 있습니다. 모닥불에는 당연히 불이 있어야될 것 같아서 파티클 시스템 구현을 시작했습니다. 구현 방식을 요약하자면 다음과 같습니다. 현재 파티클 리스트를 스트림 출력(Stream Output) 전용으로 그립니다. 래스터화기가 비활성화되어 있으므로 그 어떤 파티클도 화면에 렌더링되지는 않습니다. 기하 쉐이더는 주어진 조건에 따라 파티클들을 생성하거나 파괴합니다 (구체적인 조건은 구체적인 파티클 시스템에 따라 다릅니다. 불 파티클 시스템은 불.fx에 정의된 조건을 따릅니다.) 갱신된 파티클 리스트를 스트림 출력(Stream Output)을 통해 정점 버퍼에 기록합니다. 현재 프레임에 갱신된 파티..
[DirectX 11] Emissive
개발 일자 : 2022년 1월 26일 현재 개발 중인 프로젝트의 일본 테마 맵이 이런식인데, 창문이 굉장히 많습니다. 창문에서 햇빛이 들어오는 느낌을 표현하고 싶어서, Emissive를 개발해봤습니다. 본래, Emissive는 맨 위의 사진처럼 전광판같은 발광하는 오브젝트에 많이 사용됩니다. 기존처럼 Diffuse Map을 사용해 렌더링하는 부분은 동일한데, 추가적으로 Emissive Map을 이용해 밝아져야 하는 부분을 한 번 더 그려줍니다. 자세한 구현 방식은 아래와 같습니다. 창문으로 들어오는 햇빛을 표현하기 위해 Emissive를 개발했지만, 적합하지 않았습니다. 결론적으로 Emissive는 맨 위 사진처럼 전광판같이 인위적인 불빛을 표현하는 데 적합했습니다. 그래서 Bloom을 개발하게 되었습니..
[DirectX 11] Bloom
개발 일자 : 2022년 3월 7일 ~ 10일 지난 번에 창문으로 햇빛이 들어오는 효과를 위해서 Emissive를 개발했고 아트에게 Emissive Map도 요청해서 받았으나, 적용해보니 생각보다 느낌이 살지 않아 Bloom을 개발하게 되었습니다. 결과는 만족스럽게 나왔고 어떤식으로 개발했는지 살펴보겠습니다. 제가 참고한 Bloom 예시는 Halo3의 자료입니다. 이 자료에서 Bloom의 단계는 크게 9단계로 나뉩니다. 왼쪽에 Halo3 예시와 함께 제 엔진에서 적용된 화면을 같이 보겠습니다. 먼저, 원본 렌더타겟에 4x4 다운샘플링을 합니다. 그 후 Bloom Curve를 적용시켜 일정 밝기 이상을 추출해줍니다. 코드는 책과 Halo3 자료를 참고했습니다. float4 PS(VertexOut pin) ..
[C++] C++ 언어의 특징
[1] C++ 언어의 주요한 설계 목표 C++ 언어의 기본적인 설계 목표에 대해 알아보자. C 언어로 작성된 프로그램과의 호환성(compatability)을 유지한다. 기존에 작성된 C 프로그램을 그대로 사용할 수 있도록 C 언어의 문법적 체계를 그대로 계승한다. 또한 C 언어로 작성되어 컴파일된 목적 파일(object file)이나 라이브러리(library)를 C++ 프로그램에서 링크하여 사용할 수 있도록 한다. 소프트웨어의 재사용을 통해 소프트웨어 생산성을 높이고, 복잡하고 큰 규모의 소프트웨어 작성, 관리, 유지 보수를 쉽게 하기 위해 데이터 캡슐화, 상속, 다형성등 객체 지향 개념을 도입한다. 타입 체크를 엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다. 실행 시간의 효율성 저하를 ..
[DirectX 11] 자체 포맷 개발
개발 일자 : 2022년 2월 21일 ~ 25일 우리 팀 아트가 블렌더로 작업한 파일을 FBX파일로 익스포트하여 자체 엔진에서 임포트, 파싱하여 사용하고 있는데 문제점이 있었습니다. 첫 번째로 속도입니다. FBX파일을 임포트하고 FBX 파서에서 Triangulate 함수로 씬 내의 모든 노드를 삼각형화하는데, 이 과정에서 많은 시간이 소요됩니다. 또 FBX 익스포트 시에 특정 옵션을 주지 않는 이상 노말맵을 위한 탄젠트 스페이스를 임포트 과정 중에 구해야하는데, 이 역시 시간이 소요됩니다. 두 번째로 보안성입니다. 게임을 배포할 때 우리 팀 아트가 작업한 모델을 FBX로 익스포트해 그대로 사용한다면 이 FBX파일을 내 엔진 이외에 다른 엔진에서도 그대로 사용이 가능할 것입니다. 위의 두 가지 이유로, ..
[자료구조] 배열
배열 배열의 개념 배열은 동일한 타입의 데이터를 한 번에 여러 개 만들 때 사용된다. 예를 들어서 6개의 정수를 저장할 공간이 필요한 경우, 배열이 없다면 다음과 같이 6개의 정수형의 변수를 선언하여야 할 것이다. int list1, list2, list3, list4, list5, list6 그러나 배열이 지원된다면 아주 간단하게 다음과 같이 선언하면 된다. int list[6] 배열을 사용하면 "연속적인 메모리 공간"이 할당되고 인덱스(index) 번호를 사용하여 쉽게 접근이 가능하기 때문에 반복 루프를 이용하여 여러가지 작업을 손쉽게 할 수 있다. 배열 ADT(추상 자료형) 배열을 추상 자료형으로 정의하여 보자. 즉 배열을 단순히 "연속적인 메모리 공간"으로만 보지 말고 배열의 핵심적인 내용을 추상..