본문 바로가기

전체 글

(74)
[DirectX 12] Direct3D 초기화 Direct3D를 초기화 하는 과정은 다음과 같다. 1. D3D12CreateDevice를 이용해서 ID3D12Device를 생성한다. 2. ID3D12Fence 객체를 생성하고, 서술자들의 크기를 얻는다. 3. 4X MSAA 품질 수준 지원 여부를 검사한다. 4. 커맨드 큐과 커맨드 리스트 할당자, 그리고 주 커맨드 리스트을 생성한다. 5. Swap chain을 서술한 뒤 이를 통해 생성한다. 6. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 7. 후면 버퍼의 크기를 설정하고, 후면 버퍼에 대한 렌더 대상 뷰(Render target view)를 생성한다. 8. 깊이 * 스텐실 버퍼를 생성하고 이와 연관된 깊이 * 스텐실 뷰를 생성한다. 9. 뷰포트와 가위 판정용 사각형을 설정한다. 1. D3D12..
[OS] Process란 프로세스 - 실행중인 프로그램! OS 입장에서 보면 프로세스는 일의 한 단위! 프로세스는 일을 하는 동안 다음과 같은 자원들을 충족을 해야 한다. 1. CPU 점유 시간 2. 메모리 3. 파일들 4. I/O 프로세스는 메모리를 4가지의 레이아웃으로 나눠서 점유를 한다. 1. 텍스트 : 실행 가능한 코드에 대해 저장을 한다. 2. 데이터 : 전역 변수 static 3. 힙 : 동적으로 프로그램이 런타임동안 할당받아서 사용하는 섹션 4. 스택 : 함수가 실행되었을 때 임시 데이터 공간, 함수이 파라미터, 리턴 주소, 지역변수 프로세스 상태 New : 프로세스가 생성이 되었다. Ready : 프로세스가 프로세서에 배정받을 준비가 되었습니다. Running : 명령어 실행중이다! Waiting : 이벤트 발생(..
[DirectX 12] 명령 대기열 명령 대기열(Command Queue) CPU와 GPU간의 상호 작용을 하며 최적의 성능을 뽑아내기 위해서는 최대한 둘 다 바쁘게 돌아가야 한다. 즉 2가지 조건을 만족 해야 한다. 1. 병렬로 작동한다. 2. 동기화를 최소화 한다. 동기화를 최소화하는 이유는 간단하게 말해서 동기화가 일어나서 버스에서 인터럽트가 일어나서 하나의 장치가 활동을 하는 동안 다른 장치들이 놀고 있어야 한다면 이는 굉장히 성능 낭비라는 것이다. 그래서 DirectX 12에서는 GPU에 명령 대기열을 두고 CPU에서는 명령 목록(Command List)를 두어 Direct3D API를 이용해서 이 명령 목록에 그리기 명령들을 넣게 된다. 그리고 이를 명령 대기열에 제출한다. 이는 GPU가 명령 대기열에 있는 실행할 준비가 되었다..
[DirectX 12] DirectX 기초 지식 Direct3D는 Graphic Adapter / GPU를 제어하고 프로그래밍하는데 쓰이는 저수준 API -> 이를 이용해서 응용프로그램이 3D 그래픽 가속 기능을 이용해서 3차원 세계를 그려낸다. COM 객체 -> Component Object Model은 프로그램이 언어 독립성과 하위 호환성을 가능하게 해주는 기술 COM의 세부 사항은 프로그래머들에게 드러나지 않는다. 프로그래머들은 이 COM 객체를 이용해서 new를 직접할 필요 없이 관리할 수 있다. 그리고 delete 대신 Release를 이용해서 객체 메모리를 해제한다. 그리고 참조 횟수가 0이 되면 자동으로 메모리 해제를 한다. 윈도우에서는 WRL(Windows Runtime Library)를 이용해서 지원을 한다. Microsoft::WRL..
[Graphics] 06. 3D 이미지 생성을 위한 작업 이미지라고 생각하면 사진을 생각하면 적절하다. 카메라를 두고 어떤 피사체로 가서 셔터를 내리면 사진이 찍히는 방식이다. 즉 3차원상의 물체는 다음과 같이 찍힐 것이다. 이 때 관측자가 수직으로 바라보고 있다고 가정하자. 그럼 우린 카메라의 좌표가 필요할 것이다. 이를 Eye(Ex, Ey, Ez)로 표기하도록 하겠다. 그럼 이미지는 저 스크린의 픽셀들의 단위라고 볼 수 있을 것이다. 이 때 위의 회색처럼 Eye는 사각뿔의 모양을 가지고 스크린을 투영을 하는데 이 공간을 전문 용어로 View Frustum 즉 시각 사각뿔이라고 부른다. 이 때 이미지를 어떠한 내용을 고정시켜줘야 이미지를 딱 하나로 고정되는가를 데이터로 제공해야한다. 이는 Parameter를 제공해야 한다. 1. parameter of an ..
[Graphics] 05. 3차원상 물체 변환 앞서 알아본 2차원상 물체 변환에서 3차원으로 확대를 시키면 어떤 식으로 처리를 해야될까에 대해 고민을 해보자. 정말 간단하게도 회전을 뺸다면 대부분의 내용은 이어진다. 그럼 3차원 공간상 회전은 어떻게 이뤄질 지에 대해 알아보자. 1. 회전 3차원 공간상에서 단순히 회전하라고 준다면 어디로?라는 질문이 따라온다. 즉 회전축(Rotation axis)을 명시를 해주지 않는다면 안 된다는 것이다. 표기는 다음과 같다. 또 추가한다면 보통 오른손 좌표계라고 말하는 것을 이용한다. 이는 시계 반대방향으로 회전하는 것이 +축이라는 것이다. 그럼 z축을 먼저 정리를 해보겠다. 그렇다면 만약 x,y,z축이 아닌 어떤 벡터를 가지고 회전을 한다면 어떻게 될 것인가? if(sqrt(a*a + b*b) Rz(C>0? t..
[Graphics] 04. 2차원상 물체 변환 이제 지금까지 어떻게 선분을 그릴까, 그리고 그 선분을 어떻게 잘 잘라내서 윈도우 창에 띄울 것만 추릴까에 대해 공부를 해봤다. 이제 어떻게 이 공간 내에 있는 도형들을 변환할 수 있을까에 대해 고민을 해보자. 보통 Scale를 키우거나 아니면 이 물체를 회전시키거나, 이 도형이 이동하는 것 등등은 많이 봤을 것이다. (게임 상에서 비행기가 회전하거나, 아니면 플레이어가 이동하거나, 심지어 슈퍼 마리오에서 쿠파가 커지는 것 등등) 그렇다면 이러한 우리가 보는 것 뒤에서는 어떠한 연산이 일어나는지에 대해 잘 알아둘 필요가 있다. 이 연산은 대부분 선형대수로 변환하며, 일단 2차원을 예시로 들어보도록 하겠다. 1. 평행이동(Translation) 그대로 위치만 바뀌는 식이다. 예시는 다음과 같다. 이 때 저..
[Graphics] 03. 윈도우 클리핑 우리는 어떤 화면을 통해 컴퓨터가 그려내는 이미지 세상을 본다. 즉 화면에는 이 화면에 맞는 내용만 출력이 되어야한다는 뜻이며, 이 외의 나머지 물체나 배경은 출력이 되선 안 된다. 이 것을 바로 Window clipping이라고 한다. 어떠한 Min(Xmin, Ymin)부터 Max(Xmax, Ymax)까지로 한정된 Window 내부에 있는 부분만 잘라서 그리는데 과연 어떤 알고리즘이 필요한 지 알아보자. 1. Line Clipping (라인 클리핑) 예로들어 선분이 윈도우에 다음과 같이 걸쳐있다고 가정하자. 이 때 두 점 p1(x1, y1)과 p2(x2, y2)를 잇는 선분의 w의 내부만을 어떻게 그릴 것인가. 여기서는 보통 2가지 알고리즘이 사용된다. 1. Cohen-sutherland 알고리즘 일단..