2011-06-10 5 views
1

두 가지 유형의 객체가 있습니다. 하나는 2D이고 다른 하나는 3D로되어 다른 회전에 따라 비뚤어지고 비뚤어집니다. 그래서 SpriteBatch.Begin은 내가 End라고 부를 때까지 모든 것에 행렬을 적용합니다. 나는 어딘가에서 Begin을 두 번 호출해야합니다. 한 번 2D 스프라이트를 그려야하고 3D 오브젝트를 그리기 위해 한 번 읽었지 만, 각 3D 오브젝트의 필요에 맞게 행렬을 어떻게 바꿀 지 모르겠습니다. 그리고 나는 기억하지 못해서 매우 슬프다. 링크가 무엇인지.XNA 3.1 서로 다른 변환 매트릭스가있는 여러 스프라이트?

그래서 모든 객체에 BeginEnd을 호출하지 않고이를 수행하는 방법을 알고 싶습니다. 비참 할 수 있습니다.

+1

왜 모든 객체에서 Begin과 End를 호출하는 것이 재앙이 되는가? –

+0

글쎄, 아직 실제로이 문제를 해결하려하지 않았지만, 누락 된 링크에 해결책을 제공 한 사람은 나쁜 생각이라고 말했다. 내가 모든 객체에서이 작업을 수행한다면 Begin과 End를 Draw 메서드가 호출 될 때마다 최대 400 번 호출 할 것이고 매우 좋게 들리지는 않습니다. – TreeTree

+0

begin 및 end lots 호출은 많은 draw 호출을 트리거합니다. . OP는 그것을 시도하고 피하는 것이 정확합니다. – Martin

답변

2

여기서 올바른 해결책은 SpriteBatch을 3D 그리기에 사용하지 않는 것입니다. 실제 3D 드로잉 API를 사용해야합니다.

SpriteBatch은 2D 스프라이트 드로잉을위한 3D API의 맨 위에있는 단순한 레이어 일뿐입니다. 예를 들어 자신의 3D 버전 SpriteBatch을 작성할 수 있습니다.

SpriteBatch에는 각 배치에 둘 이상의 변환 매트릭스를 지정할 수있는 방법이 없습니다. 따라서 여러 행렬을 가져야하는 경우 여러 배치 (여러 시작/끝 블록)를 가져야합니다.

당신이 SpriteBatch 기반 솔루션에 정말 날카로운 있다면, 그것은 그런 식으로 할 입니다 - 그래서 당신은 그것을 시도하고 성능이 얼마나 볼 수 있었다.

(꼭지점 쉐이더를 대체하고, 어쨌든 3D 변환 데이터를 각 스프라이트에 압축 한 다음 쉐이더에서 압축을 풀면 아주 못생긴 해킹을 할 수 있습니다. SpriteBatch 버텍스 쉐이더를 재정의하는 것은 매우 어렵습니다. 4.0 이전의 XNA]

관련 문제