오늘은 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 |