2013-03-06 2 views
2

많은 것을 둘러 보려면 this very useful article을 읽고 그래도 여전히 내 프로젝트에 대한 해결책이 궁금합니다.XNA/MonoGame : 알파 블렌딩 UserPrimitives 깊이 정렬

Alpha Blend Problem

2 개체가 있습니다 : 2 쿼드, -1의 Z- 인덱스 1의 Z- 인덱스와 다른 하나 하나의 구성 빨간색 목적이 스크린 샷은 완벽하게 내 문제를 보여줍니다. 양쪽 쿼드는 모두 Color.Red * 0.5f입니다. 먼저 그려집니다. 다른 객체는 Z- 인덱스 0을 가진 플레이어입니다. 두 번째 가져 오기 가져 오기

플레이어를 쿼드 사이로 이동하려면 DepthStencilStateDepthStencilState.Default;으로 설정했지만 다음 이미지를 제공합니다. 플레이어의 픽셀은 앞에 오브젝트가 있기 때문에 무시됩니다.

나는 모든 기본 요소를 this class에 기반한 하나의 큰 DrawUserPrimitive로 배치합니다. 이 문제에 대한 최선의 해결책은 무엇입니까? z- 인덱스를 기반으로하는 삼각형을 정렬해야합니까 (그렇게하려면 어떻게해야합니까, 비용이 많이 듭니까?) 아니면 다른 해결책이 있습니까?

답변

3

정확히 that article에 정확히 무엇을해야합니까? 여기 XNA 4 업데이트 "가장 일반적인 방법"으로 표시 지침은 다음과 같습니다

  1. GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. 모든 불투명 기하 카메라에서 거리로 GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  3. 정렬 알파 혼합 오브젝트를 설정
  4. 그리기 설정 , 뒤에서 앞으로 순서대로 그리십시오.

투명한 오브젝트가 더 많거나 적은 볼록형 인 경우, 삼각형을 정렬 할 필요가 없습니다 emselves - RasterizerState.CullCounterClockwise을 사용하는 한 (예 : 뒷면 컬링, 기본값).

이렇게해야하는 이유는 깊이 버퍼에 하나의 값, 즉 맨 위 픽셀의 값만 저장할 수 있기 때문입니다. 저 밑에 그림을 그리는 개념은 없습니다. 이를 수행하는 데 필요한 데이터 (해당 픽셀에서 Z 색인 위아래로 그려진 객체의 색상)는 이미 최종 이미지에 혼합되어 추출 할 수 없습니다.

+0

고마워요! 그래서 나는 객체들을 정렬해야한다고 생각합니다. 도형을 사용하는 것은 도움이되지 않을 것입니다. 그러나 내 모양이 너무 기본적이고 너무 적은 삼각형으로 구성되어 있고 삼각형의 일부가 부분적으로 볼 수있는 시간이 99 %이기 때문에 실제로는 더 볼록하지 않습니다. 나는 정렬을하러 갈 것이고, 나는 아직도 (예를 들어, 2에서 빨간 물체를 깨뜨리는) 방법을 찾아야 만한다. 그러나 나는 관리 할 것이다. 모든 팁이나 기사를 환영합니다! – kapser

+0

단일 반투명 모델 (그래서 : 정렬 또는 Z 버퍼와는 별도로)의 경우에도 올바른 렌더링 결과를 얻으려면 백 페이스 컬링을 수행해야합니다. 그렇지 않으면 삼각형 순서와 카메라 방향에 따라 뒷면의 앞면을 그릴 수 있습니다. 물론 이것은 모델의 앞면을 그릴 것입니다. 따라서 앞면과 뒷면을 모두 볼 수있게하려면 (솔리드 오브젝트보다 더 빈 오브젝트처럼 보일 것입니다) 두 번 통과시켜 렌더링해야합니다 (앞면을 추 출한 다음 뒷면을 추 출). –

+0

(후면 스크린 컬링 요구 사항은 큐브 또는 구형과 같은 3D 볼록 모양입니다.) 쿼드가 아닙니다 (해당 스크린 샷에서 렌더링 할 내용을 말하기가 약간 어렵습니다). 기본적으로 저렴한 방법입니다. 실제로 삼각형을 분류하지 않고 모델별로 삼각형을 정렬합니다.) –