C++

[강의] 1월 31일 수업정리

k-codestudy 2025. 1. 31. 17:29

오늘은 direct3d11 - tutorial2에 대한 수업을 들었다.

 

그래픽 메모리와 버퍼 개념 정리

1. 그래픽 카드 메모리 vs 컴퓨터 램

  • 그래픽 카드 램: 읽는 속도는 빠르지만 쓰는 속도는 느림
  • 컴퓨터 램: 쓰는 속도는 빠르지만 읽는 속도는 느림
  • 그래픽 카드 램을 사용하는 이유는 그래픽 데이터는 읽어들이는 작업이 많기 때문

 

2. 버텍스 및 인덱스 버퍼

 

버텍스 버퍼 (Vertex Buffer)

  • 정점(버텍스) 정보를 저장하는 버퍼
  • 예: (0,0,0), (1,1,0) 등의 좌표를 저장하는 주머니

인덱스 버퍼 (Index Buffer) 

  • 버텍스 버퍼의 정점들을 인덱싱하여 저장하는 버퍼

정육면체를 그리는 과정

  • 버텍스 버퍼에 저장된 좌표들의 인덱스를 인덱스 버퍼를 통해 참조 → 삼각형 12개를 그려 정육면체 구성

 

3. HLSL (고급 셰이더 언어)

  • 기존에는 어셈블리어 사용 → 어려움 → C 언어처럼 보이도록 스크립트화 (C 언어 아님)

데이터 타입: float4 (사원수)

  • a == r == x 같은 개념 (4개 값에 접근 가능)

주요 셰이더 종류

  • VS (Vertex Shader): 정점 처리
  • PS (Pixel Shader): 색상 처리

셰이더의 어려운 점?

  • C++과 셰이더는 서로 다른 환경에서 동작
  • 데이터를 공유하려면 메모리 주소값(포인터)을 전달해야 함
  • 레이아웃 작업을 통해 "어떤 방식으로 데이터를 읽을지" 정의해야 함

 

Direct3D 11 (D3D11) 사용법

 

D3D11_USAGE 열거형

  • 게임에서 가장 많이 사용하는 설정: D3D11_USAGE_DYNAMIC
// 버텍스 버퍼 생성
SimpleVertex vertices[] =
{
    XMFLOAT3( 0.0f, 0.5f, 0.5f ),
    XMFLOAT3( 0.5f, -0.5f, 0.5f ),
    XMFLOAT3( -0.5f, -0.5f, 0.5f ),
};
D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;  // 메모리 사용 방식 지정
bd.ByteWidth = sizeof(SimpleVertex) * 3;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData, sizeof(InitData) );
InitData.pSysMem = vertices;
hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer );
if (FAILED(hr)) return hr;

 

 

셰이더 컴파일 및 입력 레이아웃 설정

  • 픽셀 셰이더는 버텍스 셰이더의 결과물을 받아서 처리
// 버텍스 셰이더 컴파일
ID3DBlob* pVSBlob = NULL;
hr = CompileShaderFromFile(L"Tutorial02.fx", "VS", "vs_4_0", &pVSBlob);
if (FAILED(hr))
{
    MessageBox(NULL, L"FX 파일을 찾을 수 없습니다.", L"Error", MB_OK);
    return hr;
}

// 버텍스 셰이더 생성
hr = g_pd3dDevice->CreateVertexShader(pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &g_pVertexShader);
if (FAILED(hr))
{
    pVSBlob->Release();
    return hr;
}

// 입력 레이아웃 정의
D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
};  // POSITION 정보를 이렇게 메모리에 저장하겠다는 의미
UINT numElements = ARRAYSIZE(layout);

 

ClearColor 설정

절대 검은색 (0,0,0)으로 설정하지 않는다

  • 이유: 만약 화면이 깨지면 검은색이어서 오류 확인이 어려움

'C++' 카테고리의 다른 글

[강의] 2월 4일 수업정리  (0) 2025.02.04
[강의] 2월 3일 수업정리  (0) 2025.02.03
[강의] 1월 24일 수업정리  (0) 2025.01.24
[강의] 1월 23일 수업정리  (0) 2025.01.23
[강의] 1월 22일 수업정리  (0) 2025.01.22