2012-03-10 2 views
0

렌더 타겟에서 CPU로 데이터를 전송하는 것에 관한 질문 (Q)을 통해 충돌을 테스트 할 수있었습니다. 내가 거기에 도착한 응답에서 렌더 타겟의 섹션을 더 작은 렌더 타겟에 드로잉 한 다음 그 데이터를 검색하는 것이 유효한 솔루션이 될 것이며 구현하려고했습니다.데이터를 잃지 않고 한 렌더 타겟에서 다른 렌더 타겟으로 직사각형을 그리는 방법은 무엇입니까?

전체 크기의 렌더 타겟 (1280x1024)을 그린 후에는 활성 렌더 타겟을 더 작은 (59X47 - 플레이어의 충돌 크기) 것으로 전환하고 큰 렌더 타겟의 섹션을 그려 봅니다. 플레이어를 작은 대상 위에 놓습니다. 처음에 나는 이것이 효과가 있다고 생각했지만, 충돌이 때때로 아주 부정확하다는 것을 알았습니다.

작은 대상을 화면에 그려 내용을 조사한 결과, 한 번에 소수의 픽셀 만 사용하고 항상 왼쪽 위 모서리에 있다는 것을 알았습니다. (분명히 축소 있지만) 그래서 내가 잘못 무슨 일이 일어나고 있는지 잘 모르겠어요 성공적를 통해 전달하는 데이터의 작은 대상 결과에 대한 전체 대형 렌더 타겟을 그리기

  // Render rectangle under player from foreground to collision layer 
      Rectangle sourceRectangle = new Rectangle(sourceX, sourceY, 
                 (int)sizeX, (int)sizeY); 
      gd.SetRenderTarget(collisionLayer[i]); 
      gd.Clear(Color.Transparent); 
      spriteBatch.Draw(foregroundLayer, collisionLayer[i].Bounds, 
               sourceRectangle, Color.White); 
      gd.SetRenderTarget(null); 

.

  // Render full target onto collision layer 
      gd.SetRenderTarget(collisionLayer[i]); 
      gd.Clear(Color.Transparent); 
      spriteBatch.Draw(foregroundLayer,new Vector2(0.0f),Color.White); 
      gd.SetRenderTarget(null); 

다음 이미지는 왼쪽 상단에 중첩 작은 타겟 큰 목표를 나타낸다. 큰 대상의 전체 데이터가 올바르게 그려진 것 같습니다.

+0

그림이 작동하지 않는 것을 보여주는가? 그것은 나에게 공정하게 보입니다 - 작은 이미지는 큰 이미지를 꽤 잘 표현한 것 같습니다. 1280x1024에서 59x47로 내려갑니다. 규모 변경이 큰 경우 완벽한 이미지를 기대할 수 없습니다. –

+0

질문에 명확하지 않은 경우 미안합니다. 문제는 전체 이미지를 복사하는 동안 플레이어 아래 사각형을 잡을 수 없다는 것입니다. 첫 번째 코드 스 니펫을 사용하는 경우 플레이어가 검은 색 잉크 (종이 텍스처가 충돌하지 않음)에 앉아서 1 : 1로 매핑하는 검은 픽셀을 포함하지 않으므로 왼쪽 상단의 그림이 비어 있어야합니다. 1이 잉크 얼룩 위에있을 경우 플레이어 밑의 이미지와 함께 표시됩니다. 내가 실제로 얻는 것은 단지 (0,0) 주위에 검은 색의 픽셀을 몇 개 가지고있어 거기에있는 데이터와 관련이없는 것처럼 보입니다. – LlamaCloud

+0

내가 보여주는 코드에 명백하게 잘못된 것이 보이지 않습니다. 내 첫 번째 직감은 sourceRectangle이 당신이 기대하는 바가 아닐 것입니다. 직사각형을 하드 코딩하여 잉크가 넘어가는 것을 알고 어딘가로 보았습니까? –

답변

2

당신은 당신의 spriteBatch.BeginspriteBatch.End 통화를 표시하지 않는,하지만 당신이 그들을 이동해야 할 것 같습니다. 특히 spriteBatch.End를 호출하기 전에 렌더링 대상을 null로 설정하거나 최소한 샘플 코드에서 렌더링 대상을 설정해야합니다.

나는 샘플 프로젝트를 설정, 나는 ... 예상대로 다음 모든 작품

GraphicsDevice.SetRenderTarget(target); 
    GraphicsDevice.Clear(Color.Transparent); 
    spriteBatch.Begin(); 
    spriteBatch.Draw(texture, target.Bounds, new Rectangle(50, 500, 100, 100), Color.White); 
    spriteBatch.End(); 

    GraphicsDevice.SetRenderTarget(null); 
    GraphicsDevice.Clear(Color.CornflowerBlue); 
    spriteBatch.Begin(); 
    spriteBatch.Draw(texture, new Rectangle(0, 0, 640, 480), texture.Bounds, Color.White); 
    spriteBatch.Draw(target, Vector2.Zero, target.Bounds, Color.White); 
    spriteBatch.End(); 

을하지만 때 렌더링의 나 SetRenderTarget(null)spriteBatch.End를 이동하는 경우 대상이 비어 ​​있습니다.

+0

스프라이트 배치는 오래전부터 시작되었고 이것이 어디서 왔는지에 따라 더 오래 끝납니다. 그러나 렌더 프로세스의 다른 부분이 필요에 따라 배치를 시작하고 끝내도록 변경할 수없는 이유는 없습니다.나는 내일까지 프로젝트를 떠난다. 그러나 나는 그것을 시험해 볼 것이다. 그리고 그것이 효과가 있다면, 나는 당신의 대답을 받아 들일 것이다. 당신의 도움을 주셔서 감사합니다. – LlamaCloud

+0

'SpriteBatch'를 끝내면 실제 그리기가 끝납니다. 렌더링 타겟을 변경 한 후에 끝내면 잘못된 렌더 타겟으로 드로잉하거나 그리기 콜을 잃어 버릴 수 있습니다. 사실, 'SpriteBatch'가 렌더링 대상을 추적 할 수 있지만 여전히'End' 호출은 그리기 호출을 플러시하므로 호출하지 않으면 그리기가 수행되지 않습니다. –

+0

방금 ​​끝 부분을 이동하고 호출을 시작하고 (여러 개의 배치로 나누기) 완전히 작동했습니다. 도와 주셔서 대단히 감사합니다. – LlamaCloud

관련 문제