목록Game Dev (263)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/JrGrM/btrk5YhBV1e/DpukK2VLltvldg55mbWnHK/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 3. 선형변환, 아핀변환, 좌표 변환, DirectXMath 변환 함수 알아 두어야 할 개념들 : 선형변환 선형변환은 벡터들 사이의 결합 연산으로 이해하면 된다. u + v는 벡터끼리의 합이고, k * v는 벡터 v에 스칼라 값 k를 곱한 scaling이다. 회전 벡터 v를 축 n에 대해 최전한다고 하자. 이러한 변환에서 회전각은 n을 내려다보는 방향(즉, n의 반대 방향)을 기준이로 시계방향으로 측정한다. 또한 ||n|| = 1 이라고 가정한다. 우선 v를 두 부분으로 분해한다. 하나는 n에 평행한 부분이고 또 하나는 n에 수직인(직교) 부분이다. 평행한 부분은 그냥 proj(v)이다...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/PWpcy/btrkSNHWem6/SAOxl0POesM7gGTd2HVIYk/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 2. DirectXMath 라이브러리의 행렬 다루기 알아 두어야 할 개념들 : 간단한 행렬 연산들 (행렬의 곱, 역행렬, 여인수, Transpose, Cramer's Rule 등)에 대한 설명을 여기에서는 다루지 않는다. 벡터와 행렬 연산에 대한 내용은 여기에서 참고하도록 하자. 대신 꼭 기억해야 할 것 한 가지만 짚고 넘어가려 한다. 가장 중요한 것 : 역행렬과 행렬식의 기하학적인 의미 두 벡터로 이루어진 행렬의 행렬식(determinant)은 평행사변형의 넓이이다. 이러한 평행사변형을 단위벡터 두 개로 이루어진 정사각형으로 변환한다고 가정해 보자(Identity Matrix 같은 녀석..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uF2F6/btrko7r5BsC/JOBPjcx89WKzEutZxBOQk1/img.jpg)
'DirectX 12를 이용한 3D 게임 프로그래밍 입문'을 읽으며 내용을 정리하고 중요한 부분을 기록하는 글입니다. 1. 벡터의 개념과 DirectXMath 라이브러리의 벡터 알아 두어야 할 개념들 : - 직교 투영 : projection이라고 하는 이 개념은, 그냥 기본이다. proj(w)v라고 하면 v벡터 중 w벡터 방향의 요소를 추출할 수 있다. - 그람 슈미트 직교화 (gram schmidt orthogonalization) 그람 슈미트 직교화는 선형대수학을 들으면 모를 수가 없을 정도로 중요한 정리이다. 간단히 말해서, N차원 공간의 벡터를 각 차원을 대표하는 벡터들로 분해(decomposition)하는 것이다. 구체적인 방법이나 증명은 아래 사진을 참고하면 된다. - 2차원 유사 외적 : 사..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/5zzYC/btrjPFw4yLy/fpwje2dEISAmJdwMk3zk9K/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 15. UV 좌표 조작과 Sampler State설정 UV 좌표 조작하기 - UV 좌표를 임의로 늘릴 순 있지만, 픽셀 데이터를 추출할 때는 반드시 0~1 범위로 맞춰야 한다. Sampler State 설정과 세팅하기 - Filter에서는 세 가지만 기억 MIN - 축소, Mag - 확대, MIP - 밉맵 - Point에서는 끊어지는 듯한 이미지, Linear는 부드러운 이미지를 얻을 수 있다. - CLAMP, WRAP 등의 Address Mode를 활용하여 확장된 UV 공간을 처리할 수 있다. Mipmap 보충설명 Execute.cpp Sampler State를 설정해 주자. //Create Sampler State { D3D11_SAMPLER_DESC de..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/MDzX2/btrjQLQFLZv/VmlZ7xfnOqaPC4LV57y8y0/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 14. Texture 설정과 이미지 띄우기 화면에 이미지 띄우기 - ID3D11ShaderResourceView를 사용하여 텍스쳐 자원 생성 - 텍스쳐 좌표계는 좌측 상단이 시작점이고, 0~1 범위로 정규화되어 있음 - HLSL에서는 Texture2D 자료형으로 텍스쳐 자원을 받는다 - 해당 픽셀이 그려낼 텍스쳐 색상을 추출하기 위해 Sample 함수를 사용한다 투명한 픽셀 제거하기 - clip() 함수를 이용해 제거할 수 있다. - if 문과 discard 키워드를 이용해 제거할 수 있다. Execute.h 먼저 헤더 파일에서 ID3D11ShaderResourceView를 만들어 준다. struct VertexTexture { D3DXVECTOR3 posit..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/6HbBy/btrjr26gYZg/0PSuRKS1MK0x67pFwD0Wr1/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 13. Rasterizer state과 좌표계 Rasterizer State 설정하기 - FillMode는 정점들로 인해 만들어진 영역을 어떻게 채울 것인가에 대한 정보이다 - CullMode는 어떤 면을 보이지 않게 할 것인가에 대한 정보이다 - FrontCounterClockWise는 정점이 그려지는 순서에 따라 앞면과 뒷면을 정해주는 값이다. Culling 과 Cliping DirectX vs OpenGL 좌표계 Execute.cpp 먼저 Execute.h에서 rasterizer_state를 선언해 준 후, Execute.cpp에서 D3DX... 에 해당하는 값들을 세팅해준다. ID3D11RasterizerState* rasterizer_state = n..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/zhYvR/btrjoOHpPez/t6fAbqPAL9y61lhk1Fc1TK/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 12. 행렬 결합 : 이동과 회전 행렬 결합하기 - 스케일 행렬에는 0이 들어가면 절대 안 된다 - 행렬은 교환 법칙이 성립하지 않는다 - 행렬 결합 순서는 스! 자! 이! 공! 부! (스케일, 자전, 이동, 공전, 부모) Execute.cpp D3DXMATRIX를 이용해서 행렬 연산을 통해 공간의 크기와 위치를 바꾸고, 회전을 시켜보자! // World : Scaling은 공간의 크기를 바꿀 수 있다. D3DXMATRIX S; D3DXMatrixScaling(&S, 100, 100, 1); std::cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/86EGK/btrjoPfcY7a/awNYpREXr7kp12iDcprn3K/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 11. Constant Buffer 개념과 응용 Constant Buffer - HLSL에서 cbuffer타입으로 받을 수 있다. - 상수 버퍼는 반드시 16byte 단위로 정렬되어야 한다. - D3D11_USAGE_DYNAMIC은 GPU가 읽고, CPU가 쓰는 방식이다. World, View, Projection 행렬 적용하기 - Vertex Shader에서 mul() 함수를 통해 위치 벡터를 행렬과 곱하여 공간 변환시킬 수 있다. - DirectX는 행 우선, HLSL은 열 우선 방식으로 행렬을 생성한다. - HLSL에서는 row_maor 키워드로, DirectX에서는 Transpose로 행렬 생성 방식을 맞춰 줄 수 있다. Execute.cpp 먼저 Co..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bazwFn/btri5k1nrUW/YtNYZjk3v7RCrMF31LlBUK/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 10. 행렬을 이용한 공간 생성(view, projection) D3DXMATRIX를 활용한 공간 생성 - D3DXMATRIX는 총 16개의 float형 데이터로 구성되어 있다. (정의 확인) - 행렬은 항상 단위행렬로 초기화해야 한다. (D3DXIdentityMatrix 함수) - 공간이 커지거나 이동하면 내부의 데이터도 동일하게 변형된다. (위치나 벡터 데이터 크기) Projection 알아보기 - 원근투영은 절두체 모양의 시야 공간을 가진다 - 직교투영은 직육면체 모양의 시야 공간을 가진다 단축키 - 영역 지정 후 Ctrl + H 단축키를 누르면 해당 범위의 특정 단어들을 바꿀 수 있다. (Alt + A 누르면 모두 바뀜) 좌표계 - OpenGL : RH..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ADYqV/btri3UaPV3q/fo3a4AgKSi7w3vN4Wc49Bk/img.jpg)
DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환 Index Buffer 만들고 세팅하기 : 중복되는 정점을 제거하기 위해 사용한다. 공간이란 무엇인가? : 공간은 행렬로 표현됨. Local - World - View - Projection 순으로 흘러감. 이때 Projection은 3D 데이터를 2D 데이터로 변환시키는 작업임. (더 자세한 내용은 주석으로) 참고 : Index Buffer를 활용해 원 그려보기 index buffer : 요즘은 4바이트, index는 unsinged int 형. 중복 정점을 줄이기 위해 사용. D3D11_USAGE_IMMUTABLE : GPU - Read, CPU - 접근 불가 Execute.cpp 지난 글에서 삼각형 2개를 이용해..