ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 함수
  • SQL
  • 알고리즘
  • c#
  • C
  • 그래픽스
  • 백준
  • 배열
  • C++
  • 파이썬
  • 문자열
  • Unity
  • 프로그래머스
  • 클래스
  • 오블완
  • string
  • 유니티
  • 티스토리챌린지
  • 포인터
  • 언리얼

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[DX11 물방울책] 챕터 5 - 렌더링 파이프라인
그래픽스/DirectX

[DX11 물방울책] 챕터 5 - 렌더링 파이프라인

2022. 7. 3. 10:42

카메라의 위치와 비추는 방향을 가지고 있는 3D 화면 정보를 가지고 2D 이미지를 만드는 과정을 통틀어서 렌더링 파이프라인이라고 칭한다.

1. 3D 환각

어떻게 깊이와 볼륨을 지닌 3D를 2D 스크린에 그릴 수가 있을까? 그건 바로 상대적으로 멀리있는 사물을 더 작게 하는 것이다.

2. 모델 송출

3D 오브젝트는 예측된 삼각형 메쉬로 구성 되어있으며 이 연속적인 삼각형들이 폴리곤을 만든다.

모델의 퀄리티를 향상시키기 위해 삼각형 늘릴 수는 있겠으나 퍼포먼스 저하 우려가 있으므로 점이라던지 직선으로도 대체가 가능하다.

3. 컴퓨터 기본 색상

컴퓨터는 각 픽셀마다 (r,g,b,a)를 비춘다.

// ARGB Color; 8-8-8-8 bit unsigned normalized integer components
// packed into a 32 bit integer. The normalized color is packed into
// 32 bits using 8 bit unsigned, normalized integers for the alpha,
// red, green, and blue components.
// The alpha component is stored in the most significant bits and the
// blue component in the least significant bits (A8R8G8B8):
// [32] aaaaaaaa rrrrrrrr gggggggg bbbbbbbb [0]
typedef struct _XMCOLOR
{
union
{
struct{
UINT b : 8; // Blue: 0/255 to 255/255
UINT g : 8; // Green: 0/255 to 255/255
UINT r : 8; // Red: 0/255 to 255/255
UINT a : 8; // Alpha: 0/255 to 255/255
};
UINT c;
};

#ifdef __cplusplus

_XMCOLOR() {};
_XMCOLOR(UINT Color) : c(Color) {};
_XMCOLOR(FLOAT _r, FLOAT _g, FLOAT _b, FLOAT _a);
_XMCOLOR(CONST FLOAT *pArray);
operator UINT () { return c; }
_XMCOLOR& operator= (CONST _XMCOLOR& Color);
_XMCOLOR& operator= (CONST UINT Color);
#endif // __cplusplus
} XMCOLOR;

// 색상 불러오기
XMVECTOR XMLoadColor(CONST XMCOLOR* pSource);

// 색상 저장
VOID XMStoreColor(XMCOLOR* pDestination, FXMVECTOR V);

4.  출력 형태

  • 버텍스 : 두 점을 연결해주는 것이다, 점이 1개면 자기 자신을 버텍스로 설정한다.

기본 토폴로지

버텍스는 렌더링 파이프라인에 종속 되어있으며 버텍스 버퍼에 저장된다.

void ID3D11DeviceContext::IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY Topology);
typedef enum D3D11_PRIMITIVE_TOPOLOGY
{
D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED = 0,
D3D11_PRIMITIVE_TOPOLOGY_POINTLIST = 1,
D3D11_PRIMITIVE_TOPOLOGY_LINELIST = 2,
D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP = 3,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5,
D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10,
D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13,
D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST = 33,D3D11_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST = 34,
...
D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST = 64,
} D3D11_PRIMITIVE_TOPOLOGY;
All subsequent drawing calls will use the currently set primitive topology until the topology is changed. The following code
illustrates:
md3dImmediateContext->IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
/* ...draw objects using line list... */
md3dImmediateContext->IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
/* ...draw objects using triangle list... */
md3dImmediateContext->IASetPrimitiveTopology(
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
/* ...draw objects using triangle strip... */

 

좌표 리스트

D3D11_PRIMITIVE_TOPOLOGY_POINTLIST 를 사용 해야하며, 모든 점들을 개별적으로 그린다.

라인 스트립

D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP  버텍스들은 선을 그리기 위해 연결한다.

라인 리스트

D3D11_PRIMITIVE_TOPOLOGY_LINELIST  모든 두 개의 점들을 선으로 연결한다.

삼각형 스트립

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP  삼각형들을 만들어 연속적으로 연결시킨다.

삼각형 리스트

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST  세 개의 버텍스를 연결 시켜 개별적인 삼각형으로 만든다.

이웃 삼각형을 지닌 삼각형

D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ  각 삼각형은 면 마다 삼각형을 가지고 있을 것이다.

컨트롤 포인트 패치 리스트

D3D11_PRIMITIVE_TOPOLOGY_ N _CONTROL_POINT_PATCHLIST 특수한 삼각형을 구현할 때 쓰인다.

5. 인덱스

Vertex quad[6] = {
v0, v1, v2, // Triangle 0
v0, v2, v3, // Triangle 1
};
Vertex octagon[24] = {
v0, v1, v2, // Triangle 0
v0, v2, v3, // Triangle 1
v0, v3, v4, // Triangle 2
v0, v4, v5, // Triangle 3
v0, v5, v6, // Triangle 4
v0, v6, v7, // Triangle 5
v0, v7, v8, // Triangle 6
v0, v8, v1 // Triangle 7
};

a는 삼각형 2개로 만들어진 쿼드이고 b는 8개의 삼각형으로 만들어진 8각형이다.

6. 버텍스 셰이더

모든 버텍스들은 버텍스 셰이더로 구성 되어있다. 

for(UINT i = 0; i < numVertices; ++i)
outputVertex[i] = VertexShader (inputVertex[i]);

로컬 좌표와 월드 좌표

하나의 오브젝트를 월드 기준으로 하는것보단 부모 오브젝트 위치랑 상대적이여야 할 때가 있다.

가운데에 있고 월드 좌표랑 확실하게 연동 되어있어서 위치를 쉽게 지정할 수가 있다.

로컬 스페이스 사용 예시

7. 뷰 스페이스

씬의 2D 이미지를 생성하기 위해선 월드에 가상 카메라를 배치할 필요가 있다. 카메라는 사용자가 얼마만큼의 범위를 볼 수가 있는지를 결정한다.

월드 좌표계에서 뷰 좌표계 (예: 유니티의 RectTransform, 언리얼의 RenderTransform)로 변환할려면 뷰 트랜폼이 필요하며 이는 뷰 행렬로 만들어진다.

 

공식 가지고 월드를 그렸을 때

XMMATRIX XMMatrixLookAtLH( // Outputs resulting view matrix V
FXMVECTOR EyePosition, // Input camera position Q
FXMVECTOR FocusPosition, // Input target point T
FXMVECTOR UpDirection); // Input world up vector j

XMVECTOR pos = XMVectorSet(5, 3, -10, 1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMMATRIX V = XMMatrixLookAtLH(pos, target, up);

8. 프로젝션과 클립 좌표계

카메라가 얼마만큼의 범위를 보여주는지 구현하기 위해선 절두체를 사용한다.

저작자표시 (새창열림)

'그래픽스 > DirectX' 카테고리의 다른 글

[DX11 물방울책] 챕터 7 - 광원  (0) 2023.07.11
[DX11 물방울책] 챕터 6 - 색상 주기, 특수한 모형 그리고 API 인터페이스  (0) 2022.11.15
DirectX 11 프레임워크 환경 설정하는 방법  (0) 2022.06.30
[DX11 물방울책] 챕터 4 - Direct3D 초기화  (0) 2022.06.30
[DX11 물방울책] 챕터3 - 트랜스폼 (위치값,회전값,크기값)  (0) 2022.06.23
    '그래픽스/DirectX' 카테고리의 다른 글
    • [DX11 물방울책] 챕터 7 - 광원
    • [DX11 물방울책] 챕터 6 - 색상 주기, 특수한 모형 그리고 API 인터페이스
    • DirectX 11 프레임워크 환경 설정하는 방법
    • [DX11 물방울책] 챕터 4 - Direct3D 초기화
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바