알파 블렌드의 문제점
알파테스트는 이펙트가 가려지지는 않는다.
3- 0.3 7 - 0.7
z버퍼값이 더작은것이 그려진다!
알파 블렌드가 켜져있으면 알파값이 0이면 실제 그려져야하는 이미지가 아닌 배경이 그려지고 깊이값은 빨간 네모의 0.3만 초기화되서 이미지가 짤리는 경우가 생긴다.
그렇다고 깊이테스트를 꺼리면 늦게그려지는애가 먼저그려지는것을 덮어버린다.
해결법 : 뒤에서부터 그리면 앞에서 그릴때 스카이랑 블렌드를 하는게 뒤에서 그린애랑 블렌드를해 이미지가 짤리지 않게해준다.
알파블렌드는 반드시 멀리있는거부터 그리는 정렬이필요하다 -> 알파 소팅
완벽하지는 않은 다른 해결법 : 알파 테스트를 해서 그리자.
알파테스트는 깊이테스트보다 먼저 수행한다.
그리지 않으면 테스트를 수행하지않는다.->깊이버퍼도 갱신하지 않는다.
But_ 알파 테스트는 알파값을 비교해서 그릴지 안그릴지를 결정한다 -(투명 혹은 불투명 밖에없음 블렌드 하지 않는다.)
테스트와 블렌드를 모두하면 - 예젠처럼 이미지가 완전 티나게 짤리지는 않는다.대신 테두리가 짤린다.(알파값이 0보다는 큰부분)
어차피 알파 소팅을 할거라면 테스트를 킬 필요가 없다.
블렌딩 or 테스트 선택기준 : 만약 맵에서 눈이 내린다면? 수많은 눈을 모두 소팅하기엔 프레임드랍이 생긴다 그냥 테스트로 테두리만 짤라서 그리는게 나을수도있다.
테스트는 정렬이 필요없다.(입자가 작고 많이그려야하는 경우는 테스트를 이용하자)
알파 소팅
렌더러 컴포넌트에서 지금은 배열을 for문으로 한번에 그려주지만 나중에 셰이딩을 위해선 어차피 나눠야하기 때문에 각각 함수로 배열을 그려주기위해 나눠주자.
해당하는배열.sort(Compare)로 정렬을 해주자.
bool Compare(CGameObject pSrc, CGameObject pDest)
{
//비교해주는 함수
//뷰스페이스상에서 카메라 기준으로 멀리있는거부터 그려줘야한다.
1의 길이 < 2의 길이 오름차순
1의 길이 > 2의 길이 내림차순
}
게임오브젝트에 z값을 구하는 함수를 만들어주자.
일단 멤버변수로 m_fCamDistance = 0.f 추가
Compute_CameraDistance(CTransform* pTransform)함수를 추가해주자.
{
1.인자로 받은 pTransform으로 월드포지션을 받아오자.
2.파이프라인에 접근해서 뷰스페이스 변환행렬을 받아온다 -> 뷰스페이스 변환행렬의 역행렬을 카메라의 월드행렬이다. 이 행렬의 4행이 카메라의 위치를 의미한다.
3.vCamPosition에 벡터를 저장해주자.
4. 내 위치벡터에서 카메라의 위치를 빼서 방향벡터를 구하고 길이를 구해주자.
}
위해서 구한 카메라와의 길이를 구하는 Get_CameraDistance함수를 만들어주자.
이펙트의 Late_Tick에서 Compute..를 호출해주고
렌더러의 렌더_게임오브젝트에서 나눠준 함수들 출력해주자.
Compute_ViewZ에서는 카메라와의 거리를 월드 포지션의 z를 구해서 넣어주자.
(뷰스페이스의 z값으로만 비교하는 경우)
빌보드
항상 카메라를 바라보는 버퍼