전체 글 403

[DX] D3DXMatrixLookAtLH 함수(카메라, Viewer)

🎥 D3DXMatrixLookAtLH D3DXMatrixLookAtLH 함수는 왼손 좌표계의 매트릭스를 작성하여 카메라를 다룰 수있도록 도와주는 함수이다. pOut - out 시킬 매트릭스 - 즉 작업의 결과인 D3DXMATRIX 구조체에 대한 포인터이다. pEye - 볼 위치 (눈 지점) - 눈점을 의미하는 Vector3 구조체에 대한 포인터이다. pAt - 볼 지점 (포커스 정도, 어디를 바라볼것인지) - 카메라를 찾는 대상을 정의하는 Vector3 구조체에 대한 포인터이다. pUp - 윗쪽 방향 - 현재 World의 최대를 정의하는 Vector3 구조체에 대한 포인터이다. D3DXMatrixLookAtLH의 매개변수는 위와 같다. pUp 매개변수는 카메라의 윗 방향을 나타내는 매개변수로, 일반적으로..

🎨DirectX 2023.02.04

[DX] 그리드(Grid) 그리기, 그리드 공식

🎨 그리드(Grid) 그리기 가로 정점의 수는 "칸 수 + 1"으로 볼 수있고, 한칸을 그릴 때 필요한 인덱스의 개수는 "칸 수 x 6" 이 된다. 전체 그리드의 정점의 개수(Vertex Count)는 (width+1) * (height+1) 이 될 것이고, 전체 그리드의 인덱스의 개수(Index Count)는 (width)* (height) * 6이다. 각 칸의 규칙을 따라가면 그리드를 그릴 때 필요한 사각형의 인덱스를 구성하는 공식을 찾을 수 있다. 우선 3x3 그리드에서 중앙에 있는 사각형의 인덱스 정보는 아래와 같다. 왼쪽 하단: 5 / 오른쪽 하단: 6 / 왼쪽 상단: 9 / 오른쪽 상단: 10 이제 해당 결과를 바탕으로 가로(width) = 3, 세로(height) = 3인 그리드에서 한 칸의..

🎨DirectX 2023.02.04

[DX] World행렬 (크기 변환 행렬)

📚 World 행렬 (크기 변환 행렬) Identity란 4x4 행렬을 전방 행렬로 만들어 주는 명령문이다. 크기라고 표시되어 있는 부분은 "스케일 행렬"이라고 부르는 객체의 크기를 나타내는 크기 변환 행렬이다. 각 인자를 _11, _22, _33 라고 부르고 순서대로 x, y, z 값을 조절한다. _41, _42, _43 인자는 각 x, y, z 의 위치를 나타내는 부분이다. ❓ 월드행렬을 사용하는 이유 월드행렬이 없다면 삼각형이나 사각형 등 어떠한 오브젝트를 그리고 나서, 해당 오브젝트의 위치를 변경하거나, 크기를 키우려면 오브젝트를 구성하는 모든 정점들의 위치값을 하나씩 수정해줘야 한다. 반면 월드행렬의 공간을 움직인다면, 모든 정점들은 월드에 존재하기 때문에 각 정점의 연산이 필요없이 모든 정점이..

🎨DirectX 2023.02.04

[DX] 사각형 그리기, Index Buffer

📒 사각형 그리기 사각형을 그릴 땐 삼각형 두개가 필요하다. 해당 삼각형 두개를 그리기 위한 각각의 정점 6개를 모두 Vertex Buffer에 추가하여 그려도 사각형은 정상적으로 출력되지만, Draw Call을 줄여 프로그램의 효율을 높이기 위한 방법으로 Index Buffer를 활용하는 것이 좋다. 이때 삼각형은 무조건 시계방향으로 그려주어야 한다. DX는 왼손 좌표계를 사용해서 도형을 그릴 때 시계방향으로 그려야 화면에 보인다. 원래 DX9가 왼손 좌표계이고 DX10부터는 오른손 좌표계인데 지금까지 나온 책들이 DX9를 기반으로 작성돼서 왼손 좌표계로 써져있는게 많다. 그리고 엔진도 다 왼손 좌표계여서 왼손좌표계에 익숙해지는게 좋다. 📙 Index Buffer 사각형을 그릴때 정점(Vertex)를 ..

🎨DirectX 2023.02.04

[DX] 컴퓨터 구조(CPU-RAM/GPU-VRAM), PrimitiveTopology (기본 도형 위상 구조)

💻 컴퓨터 구조 DX10 이상부터는 CPU를 Device라고 부르고, GPU는 Device Context라고 한다. CPU에서는 RAM에서 전달받는 데이터(int,float 변수 등)을 처리하고, GPU에서는 VRAM에서 전달받는 데이터(shader 변수 등)을 처리한다. Vertex Buffer 등 실제 Buffer는 RAM에서 먼저 만들어지기 때문에 CPU와 관련된 Device 영역에서 선언되고, 그려지기 위한 데이터들이 담겨진 Render 명령문들은 Context Device의 약자인 DC를 사용하였다. 🔺 PrimitiveTopology (기본 도형 위상 구조) PrimitiveTopology는 정점 자료를 이용해서 기하학적 기본 도형을 형성하는 방법을 설정하는 요소이다. POINTLIST 정점들..

🎨DirectX 2023.02.04

[DX] Shader Code, 쉐이더 기초 작성 (정점 출력 쉐이더 코드)

📄 04_Vertex.fx File // 정점이 입력될 자료형을 정의 struct VertexInput { float4 Position : Position; // 위치 값 하나를 입력받을 것이다. // : 뒤에 있는 Position은 어떤 용도로 사용할 것인지를 정의하는 용도이기 때문에 // 대소문자 구분 없이 사용이 가능하다 // 다른 벡터는 모두 float3(Vector3)를 사용하지만, Position만 float4(Vector4)를 사용한다. }; // 정점쉐이더로 부터 Out될 자료형을 정의 struct VertexOutput { float4 Position : SV_Position; // 위치 값 하나를 전달해줄 것이다. }; // Vertex Shader 정의 // 반환 값을 VertexOu..

🎨DirectX 2023.02.04

[DX] 렌더링 파이프라인, 공간변환

🎨 렌더링 파이프라인 파이프라인이라는 것은 한 정점이 어떤 과정을 거쳐서 렌더링 될 수 있는지(그려지는지)를 나타낸 과정이다. IA → VS → RS → PS → OM 🔸 IA (Input Assembly, 입력 조립) 렌더링 할 데이터를 집어넣는 과정으로 정점(Vertex Buffer)과 Primitive Topology 설정한다. GPU가 CPU로부터 정점 데이터를 전달 받아서 프리미티브(삼각형)들을 만든다. 정점 데이터를 CPU에서 GPU로 운반하기 위한 자료구조를 정점 버퍼(Vertex Buffer)라고 한다. 정점 버퍼는 Position, Normal, Color, UV 정보를 직렬화된 배열 형태로 담고 있다. GPU에서는 미리 전달받은 정점 버퍼의 정점들을 모아서 정점 데이터로 조립하는 것이 ..

🎨DirectX 2023.02.04

[DX] 정점(Vertex), NDC좌표계

📕 정점 (Vertex) 정점을 이용한 선 또는 삼각형을 그려보았다. 정점은 어떠한 공간상에 뭔가를 찍기(그리기) 위해 존재하는데, 정점은 위치만 가질수도 있고 위치 이외에 다른 정보들 또한 가질 수 있다. 선을 그리고자 한다면 점 하나를 찍고 다른곳에 점을 하나 더 찍어서 두 정점을 이어주는 방식으로 그려진다. 삼각형을 그리고자 한다면 정점 세개를 찍고 세개의 정점을 연결하여 그릴 수 있다. 📘 NDC 좌표계 (Normalized Device Coordinate) 이제 화면상에 정점을 그릴 때 중고등학교 수학시간에 썼던 좌표와는 다른 좌표계를 갖는다. NDC 좌표계는 정규 좌표계라고도 불리며, Normalize된 평면상의 2D 좌표라고 이해하면 좋다. NDC 좌표계는 어떠한 화면 사이즈와 상관없이 비율..

🎨DirectX 2023.02.04

[UE4] Decal(데칼), 커서(Cursor) 이미지 3D 월드에 출력, Get Hit Result Under Cursor by Channel, SetWorldLocationAndRotation, RotationFromXVector

마법사의 순간이동 기능을 구현하던 도중, 어느 지점으로 순간이동 해야할지 마우스 커서를 출력하는 기능을 구현해보았다. 🎨 Decal (데칼) Decal은 화면 공간에 텍스처를 그릴 수 있도록 도와주는 컴포넌트이다. 예를 들어 마법진이나, 문신같이 게임 속에 그림/이미지를 그려야하는 경우 사용된다. 언리얼 문서에서는 레벨의 메시에 투영되는 머티리얼로, 스태틱 메시나 스켈레탈 메시 등에 투영되는 컴포넌트를 말한다고 쓰여있다. 나는 플레이어의 순간이동 지점을 표시할 마법진을 그리기 위해 Decal 컴포넌트를 추가하였고, 바닥에 출력하기 위해 트랜스폼을 적절하게 조절하였다. 이후 디테일 패널에서 Decal 카테고리의 Decal Material 항목에 출력할 머티리얼을 설정해주었다. 나는 M_Cursor라는 쉐이..

[UE4] 좌표 공간 변환(Picking), 렌더링 파이프라인, vector4 w 값에 따른 방향벡터/위치벡터, 동차 좌표계

📚 좌표 공간 변환 (3D->2D / 2D->3D) 마법사가 마우스 포인터가 가르키는 방향으로 워프(Warp)하고 싶을 때 어디로 순간이동 할지 지점을 결정해주어야 한다. 이때 마우스로 지점을 결정하는데 마우스 좌표는 2D 좌표계인 반면, 월드 공간은 3D 좌표계이기 때문에 2D 좌표값에서 3D 좌표값으로 변환하는 작업이 필요하다. 🚩 렌더링 파이프라인 IA -> VS -> RS -> PS -> OM IA (Input Assembly) : 렌더링 할 데이터를 집어넣는 과정 VS (Vertex Shader) : 정점을 계산하는 쉐이더 RS (Rasterizer) : 3D 공간을 2D로 변환하는 것 (NDC 공간 변화) PS (Pixel Shader) : 변화된 공간을 Pixel 쉐이더로 처리하는 것 OM ..

🎮Unreal4/Basic 2023.02.04

[UE4] Enemy에서 카메라 쉐이크 구현

기본적으로 게임에 카메라는 플레이어에게만 달려있지만, Enemy 클래스에서도 카메라 쉐이크를 발동시킬 순 있다. 공격하는 애니메이션에 Camera Shake 노티파이를 삽입한다고 하면, 해당 노티파이는 플레이어에서 실행될 수도, Enemy에서 실행될 수도 있다. 따라서 두 경우 모두 카메라 쉐이크가 발동될 수 있는 블루프린트를 작성하였다. 카메라 쉐이크에 쓰이는 카메라는 PlayerController 안에 Player Camera Manager에 존재한다. 해당 객체까지 도달해야 Start Camera Shake 함수를 사용할 수있다. Actor의 Get Owner -> Character 형변환 -> Get Controller -> PlayerController 형변환 -> Player Camera Ma..

728x90