본문 바로가기

분류 전체보기

(308)
[DX12] Quaternion #1 Gimbal Lock 물체를 회전 시킬 때 x축, y축, z축의 회전 값을 합치게 되는데 합치는 과정에서 한 축이 먹통이 되는 상황이다. 합치는 것은 순서가 있기 때문에 예를 들어 x축, y축, z축 순서로 합친다고 하면 x축을 90도 돌려 y축에 정확히 겹치게 했을 때 축이 소실되는 문제가 발생한다. 짐벌 락 현상은 두번째로 결합하는 축이 사라진다. https://youtu.be/zc8b2Jo7mno 위 영상을 보면 빨간색 축에 의해 파란색 축과 초록색 축이 겹치게 된다. 한번 겹치면 파란색 축은 초록색 축과 같은 방향으로 회전할 수 밖에 없고, 결과로 축 하나가 소실되는 것이다. https://pasus.tistory.com/85 짐벌락 (Gimbal Lock) 3자유도 짐벌 시스템에는 3개의 고리가..
[수학] 복소수 복소수는 제곱해서 -1이 되는 허수이며 a + bi로 실수부(a) , 허수부(bi)로 표현할 수 있다. 복소수를 x축은 실수부, y축은 허수부의 계수로 표현하는 복소평면을 만들 수 있다. 복소수 Z의 크기는 복소평면에서 원점에서 Z까지의 거리이고 피타고라스를 이용해 a제곱 + b제곱의 루트이다. z에서 허수부만 -로 바꾼 복소수를 z의 켤레복소수라고 한다. 이 둘을 곱하면 위 처럼 a제곱 + b제곱이라는 답이 도출된다. 복소수 사칙연산 공식이다. 복소수를 행렬로 왼쪽에서 오른쪽으로 변환할 수 있다.
[DX12] Skybox 게임과 엔진에서 흔히 볼수 있는 하늘은 Skybox를 이용한 것이다. 이것은 어떻게 만들까? 단순히 플레이어 주변에 하늘 texture을 가진 구라고 생각하면 문제가 발생한다. 먼저 플레이어가 이동하다보면 skybox와 부딪힐 수 있다는 것이다. 하늘은 저 멀리 무한히 가도 도달하지 못하도록 표현되어야 한다. 그리고 skybox 뒤에 있는 물체는 표현할 수 없는 문제가 발생한다. 그래서 view좌표계 기준 depth가 1로 항상 하늘은 맨 뒤에 있어야 한다. 그리고 skybox를 카메라 위치에 두고 translation, scale 없이 rotation만 이용한다. explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT ) { FillMode = D3D12_FILL_MO..
[DX12] Lighting 코드 #2 VS_OUT VS_Main(VS_IN input) { VS_OUT output = (VS_OUT)0; output.pos = mul(float4(input.pos, 1.f), g_matWVP); output.uv = input.uv; output.viewPos = mul(float4(input.pos, 1.f), g_matWV).xyz; output.viewNormal = normalize(mul(float4(input.normal, 0.f), g_matWV).xyz); return output; } 쉐이더 코드에서 input.pos(local좌표)를 g_matWV와 곱해 View 좌표계 기준으로 변환한 것을 viewPos, input.normal을 View좌표계 기준 normal 벡터로 변환한 것을 v..
[DX12] Lighting 코드 #1 struct LightColor { Vec4diffuse; Vec4ambient; Vec4specular; }; struct LightInfo { LightColorcolor; Vec4position; Vec4direction; int32lightType; floatrange; floatangle; int32padding; }; struct LightParams { uint32lightCount; Vec3padding; LightInfolights[50]; }; Light 컴포넌트는 위와 같은 구조체들을 가지고 있는데 MaterialParams와 달리 물체마다 다른 material을 가지고 있는 것이 아니라 존재하는 LightInfo들을 모두 가지고 있다. 그리고 Material 같은 물체마다 있는 정보..
[DX12] Camera 이번에는 좌표계 변환 행렬을 이용해서 Camera를 만들어 볼 것이다. 벡터 계산 등을 위해 microsoft의 simpleMath 라이브러리를 이용한다. VS_OUT VS_Main(VS_IN input) { VS_OUT output = (VS_OUT)0; output.pos = mul(float4(input.pos, 1.f), matWVP); output.color = input.color; output.uv = input.uv; return output; } Shader 코드에서 위치를 그대로 넘기는 것이 아닌 matWVP 행렬을 곱하는데, 이것은 Local 좌표에 World 변환 행렬, View 변환 행렬 , Projection 변환행렬을 곱하는 것과 같다. class Camera : public ..
[DX12] Comoponent 이번에는 게임 엔진에서 사용되는 Component를 만들어보겠다. Component들의 조합으로 GameObject들을 만들 수 있다. shared_ptr meshRenderer = make_shared(); { shared_ptr mesh = make_shared(); mesh->Init(vec, indexVec); meshRenderer->SetMesh(mesh); } { shared_ptr shader = make_shared(); shared_ptr texture = make_shared(); shader->Init(L"..\\Resources\\Shader\\default.hlsli"); texture->Init(L"..\\Resources\\Texture\\veigar.jpg"); shared..
[DX12] Material Material은 엔진에서 볼 수 있는데 물체의 재질을 표현하는데 사용한다. DirectX에서는 Parameter 값으로 Material을 표현한다. cbuffer MATERIAL_PARAMS : register(b1) { int int_0; int int_1; int int_2; int int_3; int int_4; float float_0; float float_1; float float_2; float float_3; float float_4; }; Texture2D tex_0 : register(t0); Texture2D tex_1 : register(t1); Texture2D tex_2 : register(t2); Texture2D tex_3 : register(t3); Texture2D te..