2009-05-21 8 views
1

저는 그림 응용 프로그램을 작성하고 있으며, 그리기 캔버스는 OpenGL 텍스쳐입니다. 캔버스에 그릴 때 캔버스 텍스처의 어느 영역이 변경되었는지를 결정하고 변경 사항을 적용하기 전에 해당 픽셀 데이터를 복사합니다 (glReadPixels 사용).임의 크기의 픽셀 블록을 OpenGL ES 텍스처로 복사하십시오. 여하튼?

실행 취소하려면 복사 한 픽셀 데이터를 사용하여 이전 텍스처 상태로 간단하게 되돌리고 싶습니다. 그러나 OpenGL ES는 glDrawPixels 명령을 제공하지 않습니다. 가장 좋은 방법은 무엇입니까?

가 나는 두 가지 옵션을 고려,하지만 난 모르겠어요 것 중 하나 좋은 점이다.

  1. 내가 밖으로 복사에 그것을 그리는 픽셀을 사용하여 임시 질감을 만듭니다 (단, 복사 지역은 2의 거듭 제곱이 아님)

  2. 큰 캔버스 텍스처를 완전히 바인딩 해제하고 텍스처의 바이트를 수동으로 변경 한 다음 OpenGL에 다시 넣습니다. 나는 어떤 종류의 압축도 사용하지 않으므로 그렇게 나쁘지 않을 것입니다. 그러나 그것은 해킹처럼 보인다?

아무도 아이디어가 있습니까? 나는 정말로 그것을 바르게 평가할 것이다!

답변

1

누구나 이와 비슷한 일을 시도하면서이 문제가 발생하면 잘 작동하는 해결책을 찾았습니다.

  • 프레임 버퍼에 바인딩 한 다음 CGImageRef에 프레임 버퍼를 씀으로써 현재 텍스처의 이미지를 가져옵니다.
  • 새 CGContext를 만들고 기존 텍스처 CGImageRef를 그립니다. 그런 다음 사용자가 변경 한 부분에 오래된 텍스처 데이터를 그려 효과적으로 이미지를 변경하는 "실행 취소"하십시오.
  • 오래된 OpenGL 텍스처를 삭제하고 CGContext에서 텍스처를 만듭니다.
  • 나는 이것이 매우 느린 방법이라고 생각하지만, 거대한 성능은 필요하지 않습니다. 나의 진정한 관심은 "오래된"텍스처를 표현하기 위해 보관되는 데이터의 양을 제한하는 것이 었습니다.

    도움이 필요하면 (코드가 상당합니다) 저에게 이메일을 보내주십시오.