카메라의 위치와 비추는 방향을 가지고 있는 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... */
좌표 리스트
라인 스트립
라인 리스트
삼각형 스트립
삼각형 리스트
이웃 삼각형을 지닌 삼각형
컨트롤 포인트 패치 리스트
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
};
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 |