전체 글 125

DirectX 2D 포트폴리오 - 메이플 스토리 모작

Limitation - 저번 포트폴리오를 작업할때는 시간에 쫒겨서 작업하느라 이번에는 미리 할 수 있는 작업들은 미리미리 해놓고, 컨텐츠도 무리다 싶으면 과감하게 빼서 여유 있게 마무리해보자는 느낌으로 작업했는데 만들고 보니 생각보다 컨텐츠도 부족하고, 다른 분들의 결과물을 보니 많이 부족하다고 느낀다. 자쿰맵을 만들때 시간이 엄청 오래 걸릴 것으로 예상했는데 생각보다 그렇게 오래 걸리진 않아서 시간이 남으니 거기서 부터 계획이 좀 어긋났던것 같다. 이미 구현한 오브젝트 풀을 사용해봤는데 아무래도 엄청나게 많은 몬스터가 나와서 동시에 여러마리가 죽고 리젠되고 이런 상황이 아니다보니 오브젝트 풀을 써도 성능 개선이 거의 없는 것 같아서 아쉽다. 그리고 언리얼 공부의 중요성을 부쩍 느낀터라, 데드 라인까지 ..

포트폴리오 2022.04.18

렌더링 파이프라인(Rendering Pipeline)

렌더링 파이프라인을 검색해보면 두가지의 이미지를 발견할 수 있다. 사실 두개의 그림이 같은 내용인데 나는 다르다고 생각했다. Vertex Processing : Vertex Shader -> Hull Shader -> Tessellation -> Domain Shader -> Geometry Shader Rasterization : Rasterization Stage Fragment Processing : Pixel Shader Output Mering : Output Merger 위의 그림이 DX11기준 세분화한 것이고, 아래 그림에서는 Computer Graphics 기준에서 좀 더 포괄적인 의미의 그림이므로 이런 의미이므로 사실상 같은 내용이다 입력 조립기 단계 3D 모델 하나를 출력하기 위해선 3..

Particle 구현을 위한 Structured Buffer, Compute Shader 그리고 Geometry Shader

멀티쓰레드와 구조화버퍼를 이용해서 Compute Shader에서 파티클의 Alive 여부부터 Position, Color 등을 설정하고 Update할 수 있도록 했다. 아래 RWStructuredBuffer는 주석에서도 볼 수 있듯이 C++코드(CPU)에서가 아니라, 셰이더 코드(GPU)에서만 읽기/쓰기가 가능하게 하기 위해서 'RW'를 붙였고 C++코드에서 SRV(Shader Resource View)가 아니라 Unordered Access View(UAV)를 Set해줘야 한다. [numthreads(64, 1, 1)] 이라고 쓰여진 부분은 3차원 Cube를 생각했을때 x, y, z방향으로 각각 64개, 1개, 1개의 그룹을 만든다는 의미이고 64개에 분포되어 들어갈 쓰레드의 수는 C++코드에서 Com..

JPS(Jump Point Search) Algorithm

게임업계에서 길찾기 알고리즘에 많이 사용된다는 JPS알고리즘을 공부했다. JPS알고리즘은 A* 알고리즘과 유사하지만 대부분의 경우 A* 알고리즘보다 성능이 좋다고 한다. 우선 JPS의 핵심은 Jump Point를 찾는 것인데 그 Jump Point만 열린 목록에 넣고 A*에서 하듯이 비용을 검사한다. 당연히 A*처럼 가능한 모든 경로에 있는 노드들을 열린 목록에 넣고 검사하는 것이 아니라 비용이 더 적다. Jump Point를 찾는 방법은 2가지가 있는데 첫번째 방법은 Jumping Straight경우를 살펴보는 것이다. Jumping Straight Figure(a)가 Jumping Straight Case이다. p(x)는 x의 부모이다. p(x) 기준으로 상하좌우 중에서 오른쪽으로만 갈 수 있으니 오..

공부/Algorithm 2022.02.17

Windows에서의 동기화 기법

DirectX 공부를 하면서 게임을 만들고 있는데 멀티 쓰레드를 이용해서 로딩을 하기 위해 그에 대한 공부가 필요해져서 해보려고 한다. 사실 우리는 visual studio에서 이미 멀티 쓰레드 환경에서 프로그래밍을 하고 있다. Window환경에서의 쓰레드 생성을 위해 필요한 함수 // 새로운 쓰레드를 생성한다 // 1번째 인자는 자식 프로세스에 상속할때 설정해주는 구조체의 포인터 // 2번째 인자는 stack size. 0을 넘겨주면 자동으로 설정된다 // 3번째 인자는 생성한 쓰레드가 동작하게 될 함수 // 4번째인자는 생성한 쓰레드가 동작하게 될 함수에 넘겨줄 인자 // 마지막 인자에는 ThreadID를 받고 싶다면 unsigned int* 타입의 변수를 넣어두면 된다 uintptr_t _begin..

공부/운영체제 2022.01.22

CPU구조와 내부 구성요소들의 역할

CPU 동작 1. Fetch - 명령어 가져오기 2. Decode - 가져온 명령어 해독하기 3. Execute - 해독한 명령어를 실행 4. Writeback - 실행한 명령대로 (필요하다면)메모리에 쓰기 CPU 구성요소 ALU 실질적인 연산을 하는 장치. Adder(가산기)로 덧셈을, Complementer(보수기)로 뺄셈을, Shifter로 곱셈, 나눗셈을 할 수 있다. Control Unit 입력된 명령어를 Decoder를 이용해서 해독하고, 연산이 필요한 데이터를 메모리로부터 ALU로 옮기거나 역으로 ALU에서 계산된 결과를 메모리로 옮기는 명령을 내린다. 내부에 Bus Interface CPU가 외부에 데이터를 주고 받는 용도의 인터페이스. CPU 외부의 I/O Bus로부터 데이터를 주거나 받..

Texture, Render Target 그리고 Surface란?

렌더 타겟(Render Target) - 말 그대로 Device가 렌더링을 수행할 타겟이 되는 텍스쳐이다. 이미 우리가 알고 있듯이 DirectX에선 Resource를 파이프라인에 직접 바인딩하는 것이 아니라, 그 Resource의 View를 바인딩 해야 한다. 예를 들어, 화면에 무언가 그려내기 위해서는 백버퍼에 그려야 하는데 이 의미는 백버퍼가 렌더 타겟이 된다는 의미이고, 렌더 타겟에 무언가 그리려면 백버퍼에 대한 Render Target View를 Output Merger단계에 바인딩 해야 한다. 백버퍼가 렌더 타겟이 되는 경우가 흔히 아는 경우지만 렌더 타겟을 백버퍼가 아니라 (사용자가 지정한)텍스쳐로 할 수도 있는데, 이때는 렌더링을 텍스쳐의 Surface에 해야 한다. GetBuffer로 백..

[포트폴리오 구조] AlphaBlend 적용 방법

SpriteComponent이던, StaticMeshComponent이던 Material을 갖고 있다. Material은 멤버로 아래와 같은 녀석들을 갖고 있다. CSharedPtr m_Shader; std::vector m_TextureInfo; Vector4 m_BaseColor; float m_Opacity; class CMaterialConstantBuffer* m_CBuffer; CSharedPtr m_RenderStateArray[(int)RenderState_Type::Max]; enum class RenderState_Type { Blend, Rasterizer, DepthStencil, Max }; 여기서 m_RenderStateArray에 RenderState_Type::Blend에 미..

[포트폴리오 구조] ResourceManager, SceneResource 그리고 각종 Manager들의 관계

1. SceneResource는 특정 Scene에만 존재하는 Resource들을 Scene마다 개별적으로 관리하게 위해 존재하는 녀석 2. 기본적으로 SceneResource에 있는건 모두 ResourceManager에도 있다 3. ResourceManager는 여러개의 매니저들(MeshManager, ShaderManager, MaterialManager, TextureManager, AnimationManager)들을 관리하고, 해당 리소스에 대한 요청을하면 ResourceManager는 해당 매니저에게 똑같은 이름의 함수를 중간에서 호출해주고 결과를 받을 뿐이다. 실질적인 동작은 각각의 매니저들이 해준다. 예를 들어서 SceneResource::LoadSequence2D를 호출하면 SceneReso..