2012-04-20 2 views
1

RenderTexture로 장면을 렌더링하여 화면을 캡쳐하고 싶습니다. MotionStreakExample에서이 작업을 시도했지만 모든 것이 정상이지만 프로젝트에 코드를 복사하면이 그림이 나타납니다 (어쩌면 텍스처 일부 문제는 ... 내가) 이해할 수 없다 : enter image description hereAndengine MotionStreakExample 및 스크린 샷

@Override 
public Engine onCreateEngine(EngineOptions pEngineOptions) { 
    return new Engine(pEngineOptions) { 

     private boolean mRenderTextureInitialized; 

     private RenderTexture mRenderTextures ; 
     private Sprite mRenderTextureSprites ; 

     @Override 
     public void onDrawFrame(final GLState pGLState) throws InterruptedException { 
      final boolean firstFrame = !this.mRenderTextureInitialized; 

      if(firstFrame) { 
       this.initRenderTextures(pGLState); 
       this.mRenderTextureInitialized = true; 
      } 

      final int surfaceWidth = WIDTH*2; 
      final int surfaceHeight = HEIGHT; 


      this.mRenderTextures.begin(pGLState, false, true); 
      { 
       /* Draw current frame. */ 
       super.onDrawFrame(pGLState); 

       /* Draw previous frame with reduced alpha. */ 
      } 
      this.mRenderTextures.end(pGLState); 


      { 
       pGLState.pushProjectionGLMatrix(); 
       pGLState.orthoProjectionGLMatrixf(0, surfaceWidth, 0, surfaceHeight, -1, 1); 
       { 
        this.mRenderTextureSprites.setAlpha(1); 
        this.mRenderTextureSprites.onDraw(pGLState, this.mCamera); 
       } 
       pGLState.popProjectionGLMatrix(); 
      } 

      if (needToSave) 
      { 
       needToSave = false; 
       FSHelper.saveBitmapToFile(this.mRenderTextures.getBitmap(pGLState), SAVED_PATH+"/test.png"); 
      } 

      /* Flip RenderTextures. */ 

     } 

     private void initRenderTextures(final GLState pGLState) { 
      final int surfaceWidth = WIDTH*2; 
      final int surfaceHeight = HEIGHT; 

      final VertexBufferObjectManager vertexBufferObjectManager = mEngine.getVertexBufferObjectManager(); 
       this.mRenderTextures = new RenderTexture(mEngine.getTextureManager(), surfaceWidth, surfaceHeight); 
       this.mRenderTextures.init(pGLState); 

       final ITextureRegion renderTextureATextureRegion = TextureRegionFactory.extractFromTexture(this.mRenderTextures); 
       this.mRenderTextureSprites = new Sprite(0, 0, renderTextureATextureRegion, vertexBufferObjectManager); 
     } 
    }; 
} 

PS합니다. 빨간색 배경이 십자가 내 장면에 스프라이트입니다.

답변

1

답변을 찾았습니다. 텍스처가 동적으로로드되고 첫 번째 프레임에는 텍스쳐가 전혀로드되지 않습니다. 왜냐하면 내가 선택한 대화 상자가 있고 이후의 모든 텍스처를 만들기 때문입니다. 텍스처가 변경 될 때마다 initRenderTextures를 호출해야합니다.

+1

오래된 것을 파괴했는지 확인하십시오! –

1

Andengine에는 이미 스크린 샷을 찍을 수있는 인프라가 있습니다. 사용 해보았습니까? 예를 살펴 보겠습니다. https://github.com/nicolasgramlich/AndEngineExamples/blob/GLES2/src/org/andengine/examples/ScreenCaptureExample.java

+0

이 기능에 대해 알고 있지만 (설명 된 방법 대신에 지금 사용)이 스크린 샷의 최대 해상도는 DEVICE.WIDHTxDEVICE.HEIGHT이고 큰 것을 원합니다.) – dilix

+0

필요에 맞게 AndEngine의 ScreenGrabber를 수정할 수 있습니다. . 어쨌든, 나는 당신이 제공 한 이미지와 코드를 면밀히 살펴 봤고 무엇이 잘못되었는지 알았을 것이라고 생각합니다. 첫 번째 프레임을 찍은 것 같군, 그렇지? 다채로운 엉망은 메모리의 임의 스냅 샷처럼 보이고 AndEngine의 텍스처가 비동기 적으로로드된다는 일부 표시를 보았습니다. 이미지가 완전히로드되기 전에 너무 일찍 화면을 캡처 한 것일 수 있습니다. 스크린 샷을 찍기 전에 엔진에 수십 밀리 초를 보냅니다. – JohnEye

+0

내가 제공 한 스크린 샷은 정확히이 스크린 샷이 아니며 ddms로 촬영되었습니다 (장면을 그려야하는 곳). 나는 이것을 항상 본다. 내가 renderTextureBegin.start 및 renderTextureBegin.end 주석 모든 경우 괜찮아요 (장면),하지만 저장할 rendertexture 있습니다. 저장 버튼을 누르면 perfrom "needToSave = true"가 찍히고 찍은 스크린 샷은 비어 있습니다. begin end와 drawframe 사이에 나는 scene을 볼 수 없으며 랜덤 픽셀 – dilix