본문 바로가기

Today I Learned

23. 05. 25 - 정점 그리기

래스터라이즈


픽셀의 색을 최종 결정하는 단계가 아닌 정점 정보를 기반으로 픽셀의 정보를 만들어내기 시작한 것이다.
래스터라이즈 후 만들어진 픽셀을 픽셀 쉐이더를 통과시켜 픽셀의 색을 결정한다.

 

 

 

정점 버퍼의 생성


Vertex Buffer은 정점들을 담는 버퍼이다. CreateVertexBuffer함수로 만들 수 있다. 

 

HRESULT CreateVertexBuffer(      

    UINT Length,
    DWORD Usage,
    DWORD FVF,
    D3DPOOL Pool,
    IDirect3DVertexBuffer9** ppVertexBuffer,
    HANDLE* pHandle
);

 

Length - 정점 버퍼의 사이즈로, 정점 하나의 크기 * 정점 개수로 구할 수 있다.

 

Usage -  0으로하면 버텍스 버퍼를 정적으로 생성한다. 버텍스 버퍼 내부 정점의 값을 바꿀 필요 없을 때 정적으로 생성하며 속도가 빠르지만 값을 바꿀 때 사용하는 Lock, Unlock (DX11에서 map,unmap) 함수의 속도가 느리다. 
D3DUSAGE_DYNAMIC으로 하면 동적으로 버퍼를 생성하는데 정점을 바꿔야 할 필요 있다면 동적으로 버퍼를 생성해주는 것이 좋다. 

 

FVF - 정점의 내용을 기술하는 정보이다. (D3DFVF_XYZ는 좌표 포함, D3DFVP_NORMAL는 법선 벡터 포함 등..)

 

Pool - 리소스를 메모리에 보관하는 방식을 결정한다. 주로 D3DPOOL_MANAGED를 사용한다.

 

ppVertexBuffer - 생성한 Vertex Buffer을 여기에 저장

 

pHandle - 일단 지금은 0으로 해.

 

 


uv좌표계, 정점 순서에 앞뒤 구분

 

uv 좌표계는 각각 크기가 다른 텍스쳐를 매핑하기 위해 필요한 전체 크기가 1인 상대적인 좌표계이다. 
정점을 세팅할 때 시계방향 순서로 세팅하면 그 면을 전면, 반시계방향이면 후면이라고 인식한다.

후면으로 인식하면 컬링해서 보이지 않는다

 

 

정점 버퍼의 렌더

 

	m_pGraphic_Device->SetStreamSource(0, m_pVB, 0, m_iStride);
	m_pGraphic_Device->SetFVF(m_dwFVF);	
	m_pGraphic_Device->DrawPrimitive(m_PrimitiveType, 0, m_iNumPrimitive);

 

정점 버퍼를 렌더링하기 위해서는 자원, 정점, 렌더링 방법을 설정해야 한다.

SetStreamSource는 정점 버퍼를 장치에 데이터 스트림에 바인딩하는데 뭔소린지 모르겠다.

대충 CreateVertexBuffer로 생성한 버퍼를 렌더링할 수 있게 인자로 넣어준다고 하자. (m_iStride는 한 정점의 데이터 크기)

그리고 SetFVF로 정점의 내용을 정한다. DrawPrimitive는 렌더링하는 방법을 설정한다.