지난번에도 언급한적이 있지만 알파테스팅은 알파값에 따라 일정 부분을 아예 지워버리는 것이고
알파 블렌딩은 다른 객체와 색을 섞는 것이다. 그래서 객체를 그릴 때 알파 테스팅, 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)));
카메라로부터 물체의 거리를 구하는 법은, 먼저 카메라를 뷰행렬의 역행렬로 월드 행렬로 변환해서 월드 스페이스의 카메라의 위치를 구한다. 그리고 카메라 월드 위치에서 객체의 월드 위치를 뺀 값을 길이로 계산하면 된다.
'Today I Learned' 카테고리의 다른 글
| 23.06.12 - Cube Mapping, Skybox (0) | 2023.06.12 |
|---|---|
| 23.06.09 - Picking (0) | 2023.06.09 |
| 23.06.08 - 빌보드, 평면의 방정식을 이용한 지형 타기 (0) | 2023.06.08 |
| 23.06.07 - SetSamplerState, MipMap(밉맵), 높이 맵 (0) | 2023.06.07 |
| 23.05.30 - 직교 투영 행렬 만들기 (0) | 2023.05.30 |