DirectX11에 대한 수업을 들었다.
DirectX11 연동 방법
DirectX 11을 일반 콘솔 프로젝트에서도 사용할 수 있도록 설정하려면 아래 단계를 따르면 된다.
lib 폴더에는 d가 붙은 파일과 없는 파일이 존재한다.
- d가 붙은 파일: 디버그용 라이브러리
- d가 없는 파일: 릴리즈용 라이브러리
- 디버그용 라이브러리는 개발 중에 사용하며, 배포 시에는 릴리즈용 라이브러리를 사용한다. ( 릴리즈용이 더 빠름 )
XMVECTOR 구조
DirectX의 XMVECTOR는 __m128 타입으로 정의되어 있으며, 16바이트 단위로 정렬된다.
typedef union __declspec(intrin_type) __declspec(align(16)) __m128 {
float m128_f32[4]; // float 4개
unsigned __int64 m128_u64[2]; // int64 2개
__int8 m128_i8[16]; // int8 16개
__int16 m128_i16[8]; // int16 8개
__int32 m128_i32[4]; // int32 4개
__int64 m128_i64[2]; // int64 2개
unsigned __int8 m128_u8[16]; // int8 16개
unsigned __int16 m128_u16[8]; // int16 8개
unsigned __int32 m128_u32[4]; // int32 4개
} __m128;
- union ( 공용체 )을 사용하여 다양한 데이터 타입을 지원합니다.
- DirectX에 수학 모듈의 경우 연산 속도를 높이기 위해 4개의 float 값을 한 번에 처리하는 SIMD 명령어를 사용합니다.
- 따라서 XMVECTOR는 16바이트 정렬된 메모리를 사용합니다.
DirectX11 Vector
#include <iostream>
#include <D3D11.h>
#include <D3DX11.h>
#include <xnamath.h>
int main()
{
XMVECTOR v1{};
XMFLOAT3 f3{};
f3.x = 1.0f;
f3.y = 2.0f;
f3.z = 3.0f;
v1 = XMLoadFloat3(&f3); // XMFLOAT3를 XMVECTOR로 변환
printf("%f, %f, %f\n", v1.m128_f32[0], v1.m128_f32[1], v1.m128_f32[2]);
}
이 방법은 XMFLOAT3 값을 XMVECTOR로 변환하는 방식이지만 번거롭기에 좀 더 간단한 방법을 사용한다.
#include <iostream>
#include <D3D11.h>
#include <D3DX11.h>
#include <xnamath.h>
int main()
{
XMVECTOR v1{};
v1 = XMVectorSet(1.0f, 2.0f, 3.0f, 0.0f);
printf("%f, %f, %f, %f\n", v1.m128_f32[0], v1.m128_f32[1], v1.m128_f32[2], v1.m128_f32[3]);
}
이렇게 하면 x, y, z, w 값을 한 번에 설정할 수 있어 편리하다.
- 백터 연산 -> XMVECTOR
- 행열 -> XMMATRIX
XMVectorAdd
DirectX의 XMVECTOR 연산은 함수 호출을 통해 수행된다.
#include <iostream>
#include <D3D11.h>
#include <D3DX11.h>
#include <xnamath.h>
int main()
{
XMVECTOR v1{};
XMVECTOR v2{};
XMVECTOR v3{};
v1 = XMVectorSet(1.0f, 2.0f, 3.0f, 0.0f);
v2 = XMVectorSet(2.0f, 3.0f, 4.0f, 0.0f);
v3 = XMVectorAdd(v1, v2);
printf("%f, %f, %f, %f\n", v3.m128_f32[0], v3.m128_f32[1], v3.m128_f32[2], v3.m128_f32[3]);
}
- XMVectorAdd에 각각 Vector의 정보가 담겨 있는 v1, v2를 넣게 되면 백터의 더한 값이 나오게 된다.
XMVector3Normalize / XMVector3 Length
#include <iostream>
#include <D3D11.h>
#include <D3DX11.h>
#include <xnamath.h>
int main()
{
XMVECTOR v1{};
XMVECTOR vR1{};
XMVECTOR vR2{};
v1 = XMVectorSet(1.0f, 2.0f, 3.0f, 0.0f);
vR1 = XMVector3Length(v1); // 길이
printf("%f, %f, %f, %f\n", vR1.m128_f32[0], vR1.m128_f32[1], vR1.m128_f32[2], vR1.m128_f32[3]);
vR2 = XMVector3Normalize(v1); // 정규화
printf("%f, %f, %f, %f\n", vR2.m128_f32[0], vR2.m128_f32[1], vR2.m128_f32[2], vR2.m128_f32[3]);
}
XMVector3 Length
- 벡터의 길이 반환
XMVector3 Normalize
- 벡터를 단위 벡터로 변환 ( 정규화 )
법선 벡터(Normal Vector) 계산
법선 벡터는 두 벡터의 외적(Cross Product)을 통해 구할 수 있다
세 개의 점이 있을 때, 두 개의 벡터를 만들고 이를 외적으로 계산하면 법선을 얻을 수 있다
법선 벡터 공식
- Normal=normalize((P2−P1) ×(P3−P1))
#include <iostream>
#include <D3D11.h>
#include <D3DX11.h>
#include <xnamath.h>
int main()
{
// 세 개의 점 (P1, P2, P3)
XMVECTOR P1 = XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR P2 = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMVECTOR P3 = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
// 두 벡터 생성
XMVECTOR V1 = XMVectorSubtract(P2, P1);
XMVECTOR V2 = XMVectorSubtract(P3, P1);
// 외적 (Cross Product)
XMVECTOR normal = XMVector3Cross(V1, V2);
// 정규화 (Normalize)
normal = XMVector3Normalize(normal);
printf("Normal Vector: %f, %f, %f\n",
normal.m128_f32[0], normal.m128_f32[1], normal.m128_f32[2]);
return 0;
}
- XMVectorSubtract(P2, P1): 두 점을 빼서 벡터 생성
- XMVector3 Cross(V1, V2): 두 벡터의 외적(법선 벡터) 계산
- XMVector3 Normalize(normal): 단위 법선 벡터로 변환
정리
벡터 연산
- XMVectorAdd(): 벡터 덧셈
- XMVectorSubtract(): 벡터 뺄셈
- XMVector3 Length(): 벡터 길이
- XMVector3 Normalize(): 벡터 정규화
- XMVector3 Dot(): 벡터 내적
- XMVector3 Cross(): 벡터 외적(법선 벡터)
법선 벡터(Normal Vector)
- 두 벡터의 외적을 구한 후, 정규화하면 단위 법선 벡터를 얻을 수 있음.
'C++' 카테고리의 다른 글
[강의] 2월 5일 수업정리 (0) | 2025.02.05 |
---|---|
[강의] 2월 4일 수업정리 (0) | 2025.02.04 |
[강의] 1월 31일 수업정리 (0) | 2025.01.31 |
[강의] 1월 24일 수업정리 (0) | 2025.01.24 |
[강의] 1월 23일 수업정리 (0) | 2025.01.23 |