본문 바로가기

Today I Learned

23.06.14 - 알파 테스팅, 알파 블렌딩에서 정렬

지난번에도 언급한적이 있지만 알파테스팅은 알파값에 따라 일정 부분을 아예 지워버리는 것이고

알파 블렌딩은 다른 객체와 색을 섞는 것이다. 그래서 객체를 그릴 때 알파 테스팅, NonBlend 객체가 

알파 블렌딩, Blend 객체보다 우선시되어야 한다. Blend객체는 주변의 색과 섞기 때문에 나중에 그려도 된다.

 

	m_pGraphic_Device->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
	m_pGraphic_Device->SetRenderState(D3DRS_ALPHAREF, 100);
	m_pGraphic_Device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);

 

위 코드는 알파테스팅 코드이다. 알파값 기준점을 100으로 잡고, 알파값이 100보다 큰 경우에만 색을 출력한다.

 

	m_pGraphic_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
	m_pGraphic_Device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
	m_pGraphic_Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
	m_pGraphic_Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

 

알파 블렌딩 코드이다. 솔직히 네번째 줄 잘 모르겠음..ㅇㅇ;; 알게되면 수정해야지.

하지만 Blend 객체끼리도 서로 가리는 문제가 발생할 수 있다. 블렌딩은 이미 그려진 색과 섞는 것이기 때문에

가까이 있는 객체가 먼저 그려지고 뒤에 있는 물체를 그리려면 뒤에 있는 뒤에 있는 물체가 가려진다.

그래서 카메라로부터 거리가 먼 객체부터 그리기 위해 정렬을 해야 한다.

 

	_float4x4		ViewMatrix;
	m_pGraphic_Device->GetTransform(D3DTS_VIEW, &ViewMatrix);
	D3DXMatrixInverse(&ViewMatrix, nullptr, &ViewMatrix);

	_float3			vCamPos = *((_float3*)&ViewMatrix.m[3][0]);
	
	m_fCamDistance = D3DXVec3Length(&(vCamPos - pTransform->Get_State(CTransform::STATE_POSITION)));

 

카메라로부터 물체의 거리를 구하는 법은, 먼저 카메라를 뷰행렬의 역행렬로 월드 행렬로 변환해서 월드 스페이스의 카메라의 위치를 구한다. 그리고 카메라 월드 위치에서 객체의 월드 위치를 뺀 값을 길이로 계산하면 된다.