2011-08-16 4 views
0

XNA, 특히 SpriteBatch에 매우 미묘한 문제가 있습니다. 내 게임에는 Camera 클래스가 있습니다. 그것은보기를 번역 할 수 있으며 (또한 분명히) 확대 및 축소도 가능합니다. spritebatch 인스턴스의 "Begin"함수 (마지막 매개 변수)를 호출 할 때 장면에 카메라를 적용합니다.XNA가 SpriteBatch 드로 콜을 도려 냈습니까?

문제점 : 카메라의 Zoomfactor가 1.0f보다 클 때, 스프라이트 배치는 그리기를 중지합니다. 나는 내 장면을 디버깅하려고했지만 잘못된 곳을 발견 할 수 없었다.

"Matrix.CreateScale (2.0f);로 렌더링하려했습니다." "Begin"의 마지막 매개 변수로 사용됩니다. 다른 모든 매개 변수는 null이며 첫 번째 "SpriteSortMode.Immediate"이므로 사용자 정의 셰이더 또는 다른 것이 없습니다. 그러나 SpriteBatch는 여전히 그리기를 원하지 않았습니다.

그럼 "DrawString"만 호출하고 DrawString은 제공된 축척 (2.0f)으로 완벽하게 작동했습니다.

그러나 많은 시행 착오를 통해 ScaleMatrix에 "Matrix.CreateTranslation (0, 0, -1)"을 곱한 결과 어쨌든 "안전"값이 1.1f로 변경되었습니다. 모든 스케일 값은 1.1f까지 작동합니다. 위의 모든 경우 SpriteBatch는 일반적인 "그리기"호출에서 단일 픽셀을 렌더링하지 않습니다. (여전히 영향을받지 않는 DrawString).

왜 이런 일이 발생합니까? 뷰포트 나 다른 행렬을 설정하지 않았습니다. 이것이 이상한 Near/Farclipping 일 수 있습니다. 그러나 저는 대개 3D 물체의 매개 변수 만 알고 있습니다.

불명확 한 것이 있으면 물어보십시오!

답변

2

가까운/먼 클리핑입니다.

그리는 모든 것이 투영 공간으로 변형 된 다음 래스터 화됩니다. 이 공간은 화면의 왼쪽 하단에서 (-1, -1)에서 오른쪽 상단의 (1,1)까지 실행됩니다. 그러나 이것은 단지 (X, Y) 좌표입니다. Z 좌표에서 0에서 1 (앞에서 뒤로)입니다. 이 볼륨 외부의 항목은 잘립니다. (참고 :. 1, 2, 3)는 3D로 작업 할 때

, 당신은 Z를 압축 할 때 사용하는 투영 행렬이 아래로 조정되도록 투영 공간에서 0에 가까운 비행기 땅, 그리고 멀리 비행기 착륙

2D에서 작업 할 때는 정확히 같은 것을 수행하는 near 및 far 평면 매개 변수가있는 Matrix.CreateOrthographic을 사용합니다. 그것은 SpriteBatch가 자신의 매트릭스를 지정하고 사실, 0과 1

SpriteBatch에서 스프라이트의 정점이 할 수있는 근거리 및 원거리 평면 나뭇잎이 일반적으로 사용하지 않음에도 불구하고 Z 좌표가 단지입니다. layerDepth 매개 변수로 지정됩니다. 따라서 레이어 깊이를 0.5 이상으로 설정 한 다음 2로 스케일 업하면 Z 좌표가 0부터 1까지 유효 범위를 벗어나 렌더링되지 않습니다.

은 (문서는 0 일에하는 것이 유효 범위이지만 변형 행렬을 적용 할 때 발생하는 지정하지 않는 것을 말한다.)

해결책은 아주 간단합니다 : 당신의 Z 좌표를 조절하지 않습니다.다음과 같은 비율 조정 매트릭스를 사용하십시오.

Matrix.CreateScale(2f, 2f, 1f) 
+0

솔루션이 완벽하게 작동합니다. 정말 유익한 설명에 감사드립니다. – riki

관련 문제