일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- C++
- DESC
- 다중표본화
- 다이렉트X 튜토리얼
- swapchain
- Direct3D
- 게임수학
- 프로그래밍
- DirectX12
- DirectX
- Direct3D Init
- CommandList
- 코딩
- c
- View
- 세팅
- C언어
- CPU
- 다이렉트X
- UE4
- vertex
- Direct Init
- 전처리문
- Input Assembler
- DirectXTK
- RenderTargetView
- 동기화
- engine
- GPU
- 다이렉트 초기화
- Today
- Total
목록DirectX12 (42)
비타Cpp
카메라의 요소에는 위치와 방향만 있는 것이 아니다. 바로 카메라에 보이는 공간, 바로 절 두체(Frustum; 각뿔대, 끝이 잘린 사각뿔)에 대해 정의해야 한다. 3차원 장면을 2차원의 이미지로 표현하려면, 절두체 안에 있는 3차원 기하구조를 2차원 투영 창으로 투영해야 한다. 이때 3차원의 요소를 2차원의 투영 이미지에서 표현하는 방법 중 하나는 바로 "원근감"이다. 원근감을 나타내기 위해서는 투영을 하나의 소실점을 만들어서 절두체 모양으로 해야 하는데, 이때의 투영을 원근 투영(Perspective Projection)이다. 원근 투영은 아래 그림처럼 표현된다. 3차원 기하구조의 한 정점에서 시점(Eye Point)으로의 직선을 정점의 투영선(line of projection)이라고 한다. 원근 투영..
3차원 장면의 2차원 이미지를 만들어 내려면 장면에 가상의 카메라를 배치해야 한다. 그 카메라는 World에서 관찰자에게 보이는 영역을 결정한다. 그 영역이 바로 응용 프로그램이 2차원 이미지로 만들어서 화면에 표시할 영역이다. 아래 그림에서 나온 것처럼 이런 가상 카메라에 local좌표계를 부여한다고 치자. 이 좌표계는 시점 공간(Eye Space)이나 카메라 공간(Camera Space)라고 부르는 시야 공간(View Space)을 정의한다. 카메라는 이 시야 공간의 Local 좌표의 원점에 놓여서 양의 z 축을 바라본다. x축은 카메라의 오른쪽, y는 카메라의 위쪽 방향이다. 렌더링 파이프라인 후반부 단계들에서는 장면의 정점들을 World 공간이 아니라 이 시야 공간을 기준으로 서술하는 것이 편한 ..
행렬식은 정방 행렬을 입력받아서 실숫값을 출력하는 특별한 함수다. 정방 행렬 A의 행렬식을 det A로 표기한다. 기하학적으로 행렬식이 3차원 입체의 부피와 관련이 있다는 점과 행렬식이 선형 변환 하에서 그 부피가 변하는 방식에 대한 정보를 제공한다는 점을 증명하는 것이 가능하다. 또한 행렬식은 크라메르의 법칙(Cramer's rule)을 이용해서 1차 연립방정식을 푸는 데에도 쓰인다. 또한 행렬식은 역행렬의 가능 여부를 손쉽게 판단할 수 있다는 것도 중요하다. 일단. 행렬식을 알아보기전에 소행렬 개념을 알아야한다. n x n 행렬 A가 주어졌을 때, 그 소행렬(Minor Matrix) Aij는 i번째 행과 j번째 열을 삭제해서 나온 (n-1) x (n-1) 행렬이다. 예: 다음 행렬의 소행렬 A11, ..
비례(Scaling) 변환은 물체의 크기를 바꾸는 효과를 낸다. 다음은 비례 변환의 정의다. S(x, y, z) = (sxx, syy, szz) 이 변환은 좌표계를 기준으로 하여 벡터를 x축으로 sx 단위, y축으로 sy 단위, 그리고 z 축으로 sz단위만큼 비례한다. 그럼 이 S가 실제로 하나의 선형 변환임을 증명해보자. $$S(u+v) = (s_x(u_x + v_x),\ s_y(u_y + v_y),\ s_z(u_z + v_z))\\ =(s_xu_x + s_xv_x,\ s_yu_y + s_yv_y,\ s_zu_z + s_zv_z)\\ = (s_xu_x,\ s_yu_y,\ s_zu_z) + (s_xv_x,\ s_yv_y,\ s_zv_z) \\ =S(u) + S(v)$$ $$S(ku) = (s_xku_x,..
IA(Input Assembler) 단계에서 Primitive를 조립한 후 해당 Vertex들은 VS(Vertex Shader)단계로 넘겨진다. VS단계를 한 개의 Vertex를 받아서 한 개의 Vertex를 출력하는 단계라고 생각하면 된다. 이러한 작업을 화면에 그려지는 모든 Vertex에 대하여 수행이 된다. 개념적으로 아래와 같은 일이 벌어지는 것이다. for(UINT i = 0, i < numVerticesl i++) { outputVertex[i] = VertexShader(inputVertex[i]); } VertexShader함수의 내용은 프로그래머가 구현하여 GPU에 제출한다(HLSL : High-Level Shader Language). 이러한 함수는 각 정점에 대해 GPU에서 실행되기 ..
고형 3차원 물체(3D Primitive)의 기본 구축 요소는 삼각형이다. 예를 들어 삼각형 하나와 팔각형 하나를 Triangle List를 이용해서 구축한다고 할 때 다음은 이에 필요한 정점 배열이다. //사각형 Vertex Quad[6] = { v0, v1, v2,//삼각형1 v0, v2, v3//삼각형2 }; //팔각형 Vertex Octagon[24] = { v0, v1, v2,//삼각형1 v0, v2, v3,//삼각형2 v0, v3, v4,//삼각형3 v0, v4, v5,//삼각형4 v0, v5, v6,//삼각형5 v0, v6, v7,//삼각형6 v0, v7, v8,//삼각형7 v0, v8, v1,//삼각형8 }; 정점 배열과 위 그림을 봤을때, 각 삼각형을 이루는 정점들 중 중복되는 정점들이 ..
외적은 내적과 달리 벡터를 결괏값으로 가지는 연산이며, 외적은 오직 3차원 벡터에 대해서만 정의된다. 두 3차원 벡터 u와 v의 외적을 취하면 u와 v에 모두 직교인 벡터 w가 나온다. u = (ux, uy, uz), v=(vx, vy, vz)라고 할 때, 둘의 외적은 다음과 같이 정의된다. w = u × v = (uyvz - uzvy, uzvx - uxvz, uxvy - uyvx) 잠시 예를 들어보자. u = (2, 1, 3) , v = (2, 0, 0) 일 때, w = u × v와 z = v × u를 계산해보자. w = u × v = (2, 1, 3) × (2, 0, 0) = (1*0 - 3*0 , 3*2 - 2*0 , 2*0 - 1*2) = (0, 6, -2) z = v × u = (2, 0, 0)..
IA(Input Assembler) 단계에서는 메모리에서 기하 자료(정점과 색인)를 읽어 기하학적 기본 도형(primitive)을 조립한다.(색인은 정점들을 모아서 기본 도형을 형성하는 방식을 결정한다.) 정점(vertex)은 하나의 점을 의미한다. 하지만 Direct3D에서의 정점은 공간적 위치 이외의 정보를 담을 수 있다. 예를 들어 법선 벡터를 추가하거나, 텍스처 좌표를 추가할 수도 있다. 이를 통해 Direct3D에서는 좀 더 복잡한 효과를 유연하게 적용시킬 수 있다. 정점들은 정점 버퍼(vertex buffer)라고 하는 Direct3D 자료구조 안에 담겨서 렌더링 파이프 라인에 묶인다. 정점 버퍼는 그냥 정점들을 연속적인 메모리에 저장하는 자료구조이다. 정점 버퍼에서 기본도형들을 위한 정점의 ..