2017-10-30 18 views
1

Android Studio SDK의 ARCore에 소벨 가장자리 감지와 같은 필터를 추가하려고합니다. ARCore Android Studio 카메라보기에 필터 추가

현재 나는 glsurfaceview에서 이미지를 모든 프레임을 읽을 수
GLES20.glReadPixels(x, y, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer); 

를 사용하여 GPU-이미지 안드로이드를 사용하여 필터를 추가하고 있습니다.

하지만 프레임 저하와 같은 성능 문제가 발생하여 결국 충돌이 발생합니다. ARCore에서 이미지 데이터에 액세스하는 가장 좋은 방법은 무엇입니까?

ARCore의 BackgroundRenderer가 카메라보기를 렌더링하고 있지만 카메라 텍스처를 가져 오는 위치가 표시되지 않습니다. 필터링 된 이미지를 ARCore 카메라 미리보기에 다시 저장하려면 어떻게합니까?

답변

1

실제로이 작업을 수행하는 좋은 방법은 없습니다. They are aware of the limitation, 개인적으로는 나중에 프레임 액세스 기능을 더 빨리 추가하기를 바랍니다.

중간에 this SO post은 프레임 캡처에 도움이 될 수 있습니다. PBO 쓰기를 구현했는데 눈에 띄는 대기 시간없이 약 15fps로 프레임을 캡처 할 수 있습니다. 시간에 대한

는 이미지 데이터에 액세스하는 가장 좋은 방법은 아마 renderbuffer에 텍스처를 그리기와 지속적인 맵 픽셀의 포장을 풀고 버퍼에 glReadPixels를 사용하고. fence sync를 사용하여 glReadPixels가 완료되면 감지합니다.

또 다른 옵션은 컴퓨팅 쉐이더를 사용하고 영구 매핑 된 SSBO에 직접 쓰는 것입니다. 적은 복사합니다 (renderbuffer 픽셀은 여전히 ​​당신이 glReadPixels 후 무효 경우에도 DRAM 충돌 가능) 이상이 가능하다

(I는 EXT_buffer_storage가 폭 넓은 지원을했다 생각했다. 지속적인 매핑 제안을 무시), 그러나 그것은 또한 저개발국의 공통 코드 경로 및 렌더링/변환 전환이 발생하므로 어떤 접근 방식이 더 효율적인지에 대해 직관력이 없습니다.

+0

PBO 쓰기를 수행하는 방법의 예를 들려 줄 수 있습니까? 다음과 같이 바이트 버퍼를 사용하고 있습니다 : ByteBuffer buffer = ByteBuffer.allocate (width * height * 4); – snowrain

+0

[이 그래서 질문] (https://stackoverflow.com/questions/28570710/android-opengl-es-3-0-pbo-instead-of-glreadpixels) 본질적으로 내 구현 한 방법입니다. 첫 번째 호출에서 OpenGL 버퍼를 만들려면 일종의 init 함수가 필요합니다. [이 프리젠 테이션의] (https://www.khronos.org/assets/uploads/developers/library/2014-siggraph-bof/KITE-BOF_Aug14.pdf)에는 버퍼 생성 방법에 대한 좋은 예제가 있습니다. – deeroh

+0

PBO를 성공적으로 구현했지만 PBO가없는 glReadPixels()에 비해 성능이 전혀 향상되지 않습니다. PBO가 있거나 없거나 Google Pixel 2에서 30fps를 달성 할 수 있습니다. 내 프로젝트에서 울타리 동기화를 사용하지 않고 있습니다. 성능을 향상시키는 요인이 될 수 있습니까? @ 데로 – snowrain