2014-02-24 1 views
0

AVCapture 세션을 설정하고 대리자 메소드에서 다음 코드를 사용하여 GLKBaseEffect 텍스처를 설정하려고 시도했지만 그래도 모두 검정색입니다. 작동 시키려면 어떻게해야합니까?iOS GLKit : 카메라 출력을 사용하여 GLKBaseEffect 텍스처를 설정하십시오.

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 

CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer); 

effect.texture2d0.name = CVOpenGLESTextureGetName(pixelBuffer); 
} 

답변

1

TLDR : 난 당신이 GLKBaseEffect 카메라 출력을 사용할 수 있다고 생각하지 않습니다 - 데이터를 카메라에서 biplanar YUV 형식으로, 당신은 시간을 렌더링에서 RGB로 그 변환하는 사용자 정의 조각 쉐이더를 필요로하므로, GLKBaseEffect은 맞춤 셰이더를 사용하지 않습니다.

는 는

이 일부 API 혼란 여기에, 그래서 당신이 더 많은 배경을 원하는 경우에 읽을 것은 CVOpenGLESTexture 유형이 CVPixelBuffer에서 파생

하지만 ... 보이는 이미지 버퍼는 다시 CMSampleBufferGetImageBuffer에서 얻을 수없는 자동으로 OpenGL ES 텍스처. CVOpenGLESTextureCache을 사용하여 카메라에서 프레임을 가져올 때마다 이미지 버퍼에서 텍스처를 만들어야합니다.

Apple의 GLCameraRipple 샘플 코드는이를 수행하는 방법을 보여줍니다. 여기에 간단한 개요는 다음과 같습니다

  1. GL를 컨텍스트를 설정 한 후 setupAVCapture 방법은 그 문맥에 묶여 텍스처 캐시를 만들 CVOpenGLESTextureCacheCreate를 호출합니다.
  2. captureOutput:didOutputSampleBuffer:fromConnection:에서 그들은 CMSampleBufferGetImageBuffer을 사용하여 샘플 버퍼에서 이미지 버퍼를 가져온 다음 텍스처 캐시의 CVOpenGLESTextureCacheCreateTextureFromImage 기능을 사용하여 두 개의 OpenGL ES 텍스처를 만듭니다. 이미지 버퍼에는 두 개의 비트 평면에 YUV 색상 데이터가 있으므로 두 개의 텍스처가 필요합니다.
  3. glBindTexture을 사용하여 각 텍스처가 생성 직후 렌더링을 위해 바인딩됩니다. 일반적으로 glBindTexture 통화를 GLKBaseEffecttexture2d0.name으로 설정하고이를 prepareToDraw이라고 말하면 대체 할 수 있지만 GLKBaseEffect은 YUV를 렌더링 할 수 없습니다.
  4. Y와 UV 텍스처의 요소를 결합하여 조각 쉐이더가 먼저 YUV 벡터를 만드는 셰이더 프로그램을 사용하여 두 개의 바운드 텍스처로 그립니다. 그런 다음 HDTV에 따라 RGB 픽셀 색상으로 변환하기 위해 간단한 매트릭스 곱하기를 수행합니다 색상 공간 사양.

YUV에서 RGB로 변환하기 위해 사용자 정의 조각 쉐이더가 필요하므로 GLKBaseEffect은 도움이되지 않습니다. 그러나 GLCameraRipple 샘플에서 볼 수 있듯이 작성해야하는 사용자 정의 쉐이더는 그다지 무서운 것이 아닙니다.

+0

안녕하세요. 카메라 리플 앱에 대한 설명에 감사드립니다. 머리를 들이지 못하는 무언가가 있습니다. 드로잉을 직접 해보려고하면, 단지 두 개의 삼각형으로 화면에 텍스처를 그리기 만하면, 거대한 얼룩이 한 색으로 깜박입니다! ... 주석에 코드를 삽입 할 방법이 없습니다 ... 저는 x와 y 값이 0.0에서 1.0까지이고 Z가 -1.0에서 1.0까지의 값을 갖는 Z 모양을 Z 모양으로 만듭니다. 삼각형 스트립은 속성 포인터를 사용하여 두 정점 세트를 호출합니다. –