갬장장이
갬장장이의 코드 대장간

전체 글

computer graphics/DirectX

[D3D Engine] 4. Message loop, WinProc

앞서 2. WinMain에서 윈도우 OS는 윈도우(창)과 메세지 이렇게 두 가지가 핵심적인 역할을 한다고 언급한 바 있다. 그 중 이번에는 메세지를 자세히 살펴보자. 윈도우는 특정 사건이 발생했을 때(ex.클릭) 메세지를 보내 그에 맞는 행동을 실행하는 방식의 아키텍처이다. 이렇게 보면 message driven같기도 한데, 또 어떤 면에서는 (백그라운드에서 자원을 관리한다던지) event driven 같기도 하고, 사실 윈도우OS정도 되는 어마어마한 프로그램은 굳이 방식을 구분짓는 게 무의미하다고 생각이 들긴 한다. 아무튼 중요한 건 메세지를 보내 사건을 처리한다는 점이다. 윈도우에서 사건이 발생되면 다음과 같은 흐름으로 처리된다. 가로줄로 어플리케이션 단과 OS단을 구분지어놓은 것을 신경쓰며 살펴보자..

computer graphics/DirectX

[D3D Engine] 3. Window Creation

이번에는 실제로 눈에 보이는 윈도우 창을 띄워보자. 지난 시간에 우리의 Entry point인 WinMain 함수를 살펴보았는데, 그 세부적인 파라미터는 아래에서 확인할 수 있다. MSDN 링크: https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain #include int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // register window class /* 윈도우 함수에서 앞으로 자주 볼 방식으로, 함수에 파라미터 몇십개를 일일히 넘겨주는 것보다, 이 데이터들이 들어있는 구조체를 ..

computer graphics/DirectX

[D3D Engine] 2. WinMain

Direct3D를 사용해 무언가를 만들기 위해서 WinAPI를 익히는 건 사실상 필수적이다. 하지만 API 자체도 굉장히 낡고 복잡하고, 코드 자체도 읽기 쉽지 않기에 모든 것을 외우려고 하기 보다는 흐름과 사용법을 익힌다는 마인드로 접근하자. 빈 cpp 프로젝트를 만들고, Entry 지점이 될 cpp 파일 하나를 만들어 준다. Visual Studio를 사용한다면 필요에 따라 COnfiguration들을 바꿔주자. 또 본 학습 내용에서 C++ language standard는 가장 최신의 standard를 사용한다. 참고하자. Window 어플리케이션을 만들 때는 Entry point가 main()이 아니라 WinMain()으로 지정되어 있다. 함수 파라미터는 위와 같다. 함수에서 while(true)..

computer graphics/DirectX

[D3D Engine] 1. Introduction

3D Engine 시리즈의 포스트들은 아래 깃허브 레포지토리에서도 확인하실 수 있습니다. https://github.com/hagukin/DxEngine 본 레포지토리는 바닥부터 3D 엔진을 만들어나가는 과정을 따라가며 필요한 지식들을 익히는 것을 목표로 만들어졌다. 대략적인 학습 과정은 위와 같으며, 3D 그래픽스, 프로그래밍, 선형대수학에 대한 선수지식이 있음을 가정한다. 앞으로 학습해야 할 내용이 방대하고, 기록 목적이 정보를 공유하는 것보다는 스스로 복습하기 위한 용도인 만큼, 본 레포지토리의 학습 기록에서는 내용을 읽기 쉽게 완벽한 정리하는 것에 초점을 두기보다는 나중에 내 스스로가 다시 살펴봤을 때 이해할 수 있을 정도로만 핵심 내용들만 간추려서 정리할 내용이다. 윈도우 API 파트는 추후 다..

software engineering/algorithms

<안내글>

알고리즘과 관련된 정리 내용은 앞으로 특별한 경우가 아니면 아래 레포지토리 내 문서에 기록할 예정입니다. https://github.com/hagukin/PS/blob/main/algorithms.md

software engineering/PS

<안내글>

알고리즘 문제풀이는 특별한 경우가 아니면 앞으로는 블로그 대신 아래 레포지토리에 기록할 예정입니다. https://github.com/hagukin/PS

cs

쿠버네티스

https://www.samsungsds.com/kr/insights/220222_kubernetes1.html?moreCnt=0&backTypeId=&category= 쿠버네티스 알아보기 1편: 쿠버네티스와 컨테이너, 도커에 대한 기본 개념 요즘 IT 생태계에 관심이 많으신 분들이라면 쿠버네티스라는 단어를 들어 보셨을 텐데요. 쿠버네티스에 대해 개발자들의 관심이 높아지고 있고, 여러 대기업에서 새로운 시스템을 쿠버네티스를 www.samsungsds.com https://m.post.naver.com/viewer/postView.naver?volumeNo=31722475&memberNo=24985926 [NDC 2021] 데브시스터즈가 품은 '미지의 존재', 쿠버네티스에 대하여 [BY 디스이즈게임] 게이..

computer graphics/3D Graphics

[3DGraphics] 22. Camera view

이번 시간에는 카메라를 이동시킬 수 있는 기능을 구현해보자. 현재 우리의 프레임워크에서는 카메라의 좌표와 방향이 고정되어있는데, 이를 보다 유동적으로 동작할 수 있도록 수정해보자. (사실 이 내용은 예전에 내가 블로그에서 다룬 적이 있는 내용이기도 하다. 참조) 스크린에 나타나는 물체의 위치는 물체와 카메라의 상대적 위치관계에 의해 결정되는 것을 알 수 있다. (2D 카메라의 경우부터 생각해보면 쉽다. 카메라가 위로 움직이면 물체는 아래로 움직인다) 때문에 카메라의 실제 좌표를 파이프라인 상에서 자유롭게 움직이게 하는 대신, 카메라를 고정시켜 두고 물체들이 카메라의 움직임에 맞추어 상대적으로 이동하게 만드는 방법을 사용할 수 있다. (이렇게 하는 가장 큰 이유는 파이프라인에서 카메라의 좌표는 0,0,0이..

computer graphics/3D Graphics

[3DGraphics] 21. Clipping

시작에 앞서 지금까지 구축한 파이프라인을 한 번 살펴보자. 정점이 처리되며 거쳐가는 공간은 위와 같다. homogeneous coordinates와 ndc space로의 변환은 지난 글에서 다루었던 내용이다. 파이프라인의 세부적인 프로세스들을 살펴보면 다음과 같다. 정점을 나눠 vertex shader를 거치고 triangle assembly로 삼각형들로 만든 후, 카메라 방향에 의한 culling을 처리하고, geometry shader를 거치고 나서 persepctive division 및 screen transform을 처리하고, triangle rasterization, z-buffering을 처리한 후 pixel shader를 처리하고 최종적으로 스크린에 렌더링한다. 여기서 잠시 한 가지 문제를..

computer graphics/3D Graphics

[3DGraphics] 20. Projection matrix

Projection matrix(투영 행렬)은 아주 중요하고 아주 널리 다루어지지만 완벽하게 이해하기 까다로운 내용이다. 본 학습에서는 이를 최대한 완벽하게 이해할 수 있도록 다뤄보겠다. 본 학습에서 구현하고자 하는 기능은 화면 ratio 조절, fov 조절이다. 그리고 이 기능들을 추가하기 위한 더 나은 frustum을 사용한 projection 방법을 적용할 것이다. (Frustum이 뭔지는 잠시 뒤에서 다루겠다) 그리고 이 Frustum을 사용한 projection 방법은 정점에 Projection matrix를 곱하는 과정을 통해 이루어지는데, 우리는 이 과정에 필요한 이 projection matrix를 구하는 과정을 살펴볼 것이다. 우리의 프레임워크에서는 현재로써는 focal plane(Fru..

computer graphics/3D Graphics

[3DGraphics] 19. Implementing Vec4, Mat4

크기 4짜리 벡터와 4x4 행렬을 우리 프레임워크가 지원가능하도록 만들어보자. 더 자세히 들어가기 전에, 우리의 프레임워크는 row vector(가로로 긴 형태의 벡터)를 기본값으로 한다는 걸 예전 글에서도 언급한 적 있다. (DirectX 또한 row vector를 기본값으로 한다 - https://nicoschertler.wordpress.com/2012/01/27/directx-and-matrices/) 때문에 행렬-벡터 연산 또한 이에 맞추어 계산된디. (실제로 아래 코드에서 .Translation() 함수를 살펴보면 우리가 흔히 아는 변환행렬의 꼴을 transpose한 모습, 즉 tx ty tz가 행렬 아랫부분에 위치하고 있음을 알 수 있다.) 왜 4x4를 지원해야 하는가에 대한 설명은 잠시 뒤..

computer graphics/3D Graphics

[3DGraphics] 18. Specular highlights

물체가 질감에 따라 다르게 보이는 이유는 무엇일까? 질감에 따라 표면의 울퉁불퉁한 정도가 다르고, 때문에 빛이 표면에서 반사되는 방향이 표면 자체의 방향과 일치하지 않기 때문이다. 이번 포스트에서는 이러한 질감을 구현하기 위해 물체의 Diffuse와 Specular한 정도에 따라서 빛이 적절한 수준으로 퍼지게 만들어 보다 현실적인 그래픽을 그려보겠다. 구현에 앞서 한가지 질문을 던져보겠다. 반짝거리는 금속과 같은 물체에 보이는 "광"은 왜 나타나는 것일까? 빛이 물체의 표면에 맞고 반사되어 카메라(관찰자)를 향해 맞는다면 그 부분이 더 밝게 보이기 때문에 광이 보이는 것이다. 이를 컴퓨터그래픽스에서는 어떻게 구현해야 할까? 단순히 어떤 빛이 물체의 표면 위의 점 A에 맞고 튕겨나온 반사광이 카메라가 위치..