C++

[강의] 2월 3일 수업정리

k-codestudy 2025. 2. 3. 17:43

DirectX11에 대한 수업을 들었다.

 

 

DirectX11 연동 방법

DirectX 11을 일반 콘솔 프로젝트에서도 사용할 수 있도록 설정하려면 아래 단계를 따르면 된다.

속성 → 링커 → 입력 → 추가 종속성
속성 → 구성 속성 → VC++ 디렉터리 → 일반 → 실행 가능 디렉터리
속성 → 구성 속성 → VC++ 디렉터리 → 일반 → 포함 디렉터리
속성 → 구성 속성 → VC++ 디렉터리 → 일반 → 라이브러리 디렉터리

 

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