TLDR : 난 당신이 GLKBaseEffect
카메라 출력을 사용할 수 있다고 생각하지 않습니다 - 데이터를 카메라에서 biplanar YUV 형식으로, 당신은 시간을 렌더링에서 RGB로 그 변환하는 사용자 정의 조각 쉐이더를 필요로하므로, GLKBaseEffect
은 맞춤 셰이더를 사용하지 않습니다.
는 는
이 일부 API 혼란 여기에, 그래서 당신이 더 많은 배경을 원하는 경우에 읽을 것은 CVOpenGLESTexture
유형이 CVPixelBuffer
에서 파생
하지만 ... 보이는 이미지 버퍼는 다시 CMSampleBufferGetImageBuffer
에서 얻을 수없는 자동으로 OpenGL ES 텍스처. CVOpenGLESTextureCache
을 사용하여 카메라에서 프레임을 가져올 때마다 이미지 버퍼에서 텍스처를 만들어야합니다.
Apple의 GLCameraRipple
샘플 코드는이를 수행하는 방법을 보여줍니다. 여기에 간단한 개요는 다음과 같습니다
- GL를 컨텍스트를 설정 한 후
setupAVCapture
방법은 그 문맥에 묶여 텍스처 캐시를 만들 CVOpenGLESTextureCacheCreate
를 호출합니다.
captureOutput:didOutputSampleBuffer:fromConnection:
에서 그들은 CMSampleBufferGetImageBuffer
을 사용하여 샘플 버퍼에서 이미지 버퍼를 가져온 다음 텍스처 캐시의 CVOpenGLESTextureCacheCreateTextureFromImage
기능을 사용하여 두 개의 OpenGL ES 텍스처를 만듭니다. 이미지 버퍼에는 두 개의 비트 평면에 YUV 색상 데이터가 있으므로 두 개의 텍스처가 필요합니다.
glBindTexture
을 사용하여 각 텍스처가 생성 직후 렌더링을 위해 바인딩됩니다. 일반적으로 glBindTexture
통화를 GLKBaseEffect
의 texture2d0.name
으로 설정하고이를 prepareToDraw
이라고 말하면 대체 할 수 있지만 GLKBaseEffect
은 YUV를 렌더링 할 수 없습니다.
- Y와 UV 텍스처의 요소를 결합하여 조각 쉐이더가 먼저 YUV 벡터를 만드는 셰이더 프로그램을 사용하여 두 개의 바운드 텍스처로 그립니다. 그런 다음 HDTV에 따라 RGB 픽셀 색상으로 변환하기 위해 간단한 매트릭스 곱하기를 수행합니다 색상 공간 사양.
YUV에서 RGB로 변환하기 위해 사용자 정의 조각 쉐이더가 필요하므로 GLKBaseEffect
은 도움이되지 않습니다. 그러나 GLCameraRipple
샘플에서 볼 수 있듯이 작성해야하는 사용자 정의 쉐이더는 그다지 무서운 것이 아닙니다.
안녕하세요. 카메라 리플 앱에 대한 설명에 감사드립니다. 머리를 들이지 못하는 무언가가 있습니다. 드로잉을 직접 해보려고하면, 단지 두 개의 삼각형으로 화면에 텍스처를 그리기 만하면, 거대한 얼룩이 한 색으로 깜박입니다! ... 주석에 코드를 삽입 할 방법이 없습니다 ... 저는 x와 y 값이 0.0에서 1.0까지이고 Z가 -1.0에서 1.0까지의 값을 갖는 Z 모양을 Z 모양으로 만듭니다. 삼각형 스트립은 속성 포인터를 사용하여 두 정점 세트를 호출합니다. –