그래픽스/DirectX
DirectX 12 멀티 스레드 렌더링 (Multi-Thread Rendering)
현재 프로젝트에서 사용 중인 스레드의 개수는 4개이다. 싱글 스레드 렌더링과 멀티스레드 렌더링의 성능을 비교해보겠다. 우선 사용하고 있는 메쉬 모델 데이터의 정보이다. 애니메이션 정보가 없는 스태틱 메쉬의 경우 vertex 정점 11,400개 / index 3,800개이다. 애니메이션 스키닝을 해야 하는 다이나믹 메쉬의 경우 vertex 정점 51,294개 / index 17,096개이다. 모든 오브젝트에 대해서 인스턴싱은 적용 X. 모든 오브젝트는 vertex 셰이더와 pixel 셰이더를 통해 렌더링 한다. 1. StaticMesh x1000 한 번 장면을 그릴 때마다 그리는 vertex의 개수는 11,400 * 1,000 = 11,400,000개. 그림자 깊이까지 총 2번을 그리므로 11,400,00..
[Direct X] Constant Buffer(상수 버퍼) 란?
상수 버퍼(Constant buffer)는 정점 및 픽셀 셰이더에서 사용될 상수를 모아 놓은 버퍼이다. 상수 버퍼 사용을 위해 cpp 코드 영역에 상수 버퍼 타입의 구조체를 정의하고 셰이더에도 동일한 포맷으로 상수 버퍼 구조체를 정의. 그리고 시스템 메모리에서 구조체 변수 생성 및 값 설정 후 정점 혹은 픽셀 셰이더에 Set 시킨다. 값 설정 및 set은 보통 매 프레임 실행되는 Render() 함수에 적용한다. 그러면 이 Set 시킨 데이터를 설정한 셰이더에서 사용할 수 있다. 상수 버퍼를 사용하는 이유? 셰이더에서 매번 사용되는 상수, 하지만 cpp 파일에서 전달해주어야 한다고 가정할 때, 개별적으로 하나하나 값을 전달해 주는 것은 대역폭(bandwidth)이 크고 부담이 많이 된다고 한다. 따라서 ..
[DX11] 튜토리얼 4 - 3D 공간
메커니즘은 매 프레임마다 Y값을 회전하고 이를 상수버퍼에다 실은 후 셰이더 파일에 1:1 매핑 시킴으로써 큐브의 버텍스가 매 프레임마다 위치를 변경하는데 마치 회전하는 효과를 준다. // 행렬의 전이를 계산 ConstantBuffer cb; cb.mWorld = XMMatrixTranspose( g_World ); cb.mView = XMMatrixTranspose( g_View ); cb.mProjection = XMMatrixTranspose( g_Projection ); g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb, 0, 0 ); g_pImmediateContext->VSSetShader( g_pVertexShade..
DirectX와 HLSL간의 행렬 순서와 연산
예제 프로그램의 셰이더 코드에서는 'World * View * Projection' 순으로 행렬연산을 수행하는게, 내 프로그램에서는 'Project * View * World' 순으로 연산해야 정상적인 결과가 나왔기 때문이다. 컴퓨터에서 다차원 배열로 행렬을 구성할 때, 행렬을 어떤 순서로 접근할 것인지에 대한 순서가 있다. DirectX에서는 행렬 순서가 row-major(행우선)이고, HLSL에서는 column-major(열우선)이다. 위와 같이 행렬을 접근하는 순서가 다르기 때문에, 사용하는 라이브러리에 명시된 순서를 확인하고 그에 맞게 연산을 하지 않으면 제대로 된 결과가 나오지 않는다. 서로간의 행렬 순서가 달랐기 때문에, DirectX에서는 'World * View * Projection' 순..
[DX11] 튜토리얼 2 - 삼각형 렌더링
우선적으로 봐야할게 ID3D11DeviceContext*에 대한 포인터 변수다 / 디바이스 컨텍스트란? 디스플레이 또는 프린터와 같은 디바이스의 그리기 특성에 대한 정보를 포함하는 Windows 데이터 구조다. 모든 그리기 호출은 선, 도형 및 텍스트를 그리기 위해 Windows API를 캡슐화하는 디바이스 컨텍스트 개체를 통해 수행된다. ID3D11DeviceContext* g_pImmediateContext = NULL; 아래는 InitDevice 함수에 해당하는 내 / 렌더 타겟 뷰 개념 참조 // 하나 이상의 렌더링 대상을 원자성으로 바인딩하고 깊이 스텐실 버퍼를 // 출력-병합 단계에 바인딩합니다. g_pImmediateContext->OMSetRenderTargets( 1, &g_pRender..
DirectX 렌더 대상 뷰 (RTV) 생성
Direct3D는 자원 자체를 직접 파이프라인의 단계에 묶지 않는다. 대신 반드시 자원에 대한 뷰(서술자)를 생성해서 그 뷰를 파이프라인 단계에 묶어야 한다. 특히 후면 버퍼를 파이프라인의 출력 병합기(Output Merger) 단계에 묶으려면(그래야 Direct3D가 장면을 후면 버퍼에 렌더링 할 수 있다.) 후면 버퍼에 대한 렌더 대상 뷰를 생성해야 한다. 우선 할 일은 교환 사슬에 저장되어 있는 버퍼 자원을 얻는 것인데, 이를 위해 다음과 같은 메서드를 사용한다. HRESULT IDXGISwapChain::GetBuffer( UINT Buffer, REFIID riid, void **ppSurface ); 1. Buffer: 얻고자 하는 특정 후면 버퍼를 식별하는 색인(교환 사슬에 버퍼가 여러 개 ..
[DX11 물방울책] 챕터 7 - 광원
7.0 개념 왼쪽 동그라미는 광원이 꺼져있어서 2D처럼 보인다 그에 반해 오른쪽 동그라미는 광원과 그림자가 추가되었기 때문에 3D처럼 인식된다. 이 모델에선 광원이 다양한 색상을 비추기 위해 rgb 색상 중 임의의 밝기로 조절할 수 있다. 빛이 어떠한 물체와 충돌 시 그 빛은 흡수 후 반사 되고 그렇게 소멸된다. 로컬 광원은 밝기의 중점이 물체에 있고, 각기 다른 밝기를 가지고있고 다른 물체와 독립적이다. 글로벌 광원은 각 물체의 밝기를 고려할 뿐만 아니라 전체 씬의 존재하는 오브젝트의 반사되는 빛 또한 고려한다. 상대적으로 비용이 매우 비싸며 이를 보완하기 위해 계속해서 연구 중에 있다. 7.2 단일 벡터 면이라는건 하나의 물체가 바라보고 있는 방향을 뜻한다. 표면이라는건 땅으로부터 바라보고 있는 방향..
[DX11 물방울책] 챕터 6 - 색상 주기, 특수한 모형 그리고 API 인터페이스
6.1 버텍스와 인풋 레이아웃 사용자 정의 버텍스 포멧을 생성하기 위해선 데이터들을 들고있을 구조체를 먼저 생성해야 한다. 다음은 두 개의 다른 버텍스에 대한 구조체이며 하나는 위치와 색상 그리고 하나는 텍스처의 위치,노멀 그리고 피벗 축을 가지고 있다. struct Vertex1 { XMFLOAT3 Pos; XMFLOAT4 Color; }; struct Vertex2 { XMFLOAT3 Pos; XMFLOAT3 Normal; XMFLOAT2 Tex0; XMFLOAT2 Tex1; }; 정의한 후 Direct3D에게 정보를 넘겨줘야 한다 그래야 의도와 맞게 출력을 해주기 때문이다. ID3D11InputLayout 형태로 보내진다, 이러한 형태는 D3D11_INPUT_ELEMENT_DESC 구조체형인 배열이..
[DX11 물방울책] 챕터 5 - 렌더링 파이프라인
카메라의 위치와 비추는 방향을 가지고 있는 3D 화면 정보를 가지고 2D 이미지를 만드는 과정을 통틀어서 렌더링 파이프라인이라고 칭한다. 1. 3D 환각 어떻게 깊이와 볼륨을 지닌 3D를 2D 스크린에 그릴 수가 있을까? 그건 바로 상대적으로 멀리있는 사물을 더 작게 하는 것이다. 2. 모델 송출 3D 오브젝트는 예측된 삼각형 메쉬로 구성 되어있으며 이 연속적인 삼각형들이 폴리곤을 만든다. 모델의 퀄리티를 향상시키기 위해 삼각형 늘릴 수는 있겠으나 퍼포먼스 저하 우려가 있으므로 점이라던지 직선으로도 대체가 가능하다. 3. 컴퓨터 기본 색상 컴퓨터는 각 픽셀마다 (r,g,b,a)를 비춘다. // ARGB Color; 8-8-8-8 bit unsigned normalized integer components..
DirectX 11 프레임워크 환경 설정하는 방법
SDK 다운로드 사이트 https://www.microsoft.com/ko-KR/download/details.aspx?id=6812 Download DirectX SDK from Official Microsoft Download Center 중요! 아래에서 언어를 선택하면 전체 페이지 내용이 해당 언어로 신속하게 변경됩니다. 네덜란드어독일어러시아어스웨덴어스페인어영어이탈리아어일본어중국어(간체)중국어(번체)체코어포 www.microsoft.com https://github.com/jjuiddong/Introduction-to-3D-Game-Programming-With-DirectX11 GitHub - jjuiddong/Introduction-to-3D-Game-Programming-With-DirectX..