دائرة الرقابة الداخلية جلكيت:ضبط نسيج GLKBaseEffect مع إخراج الكاميرا
-
20-12-2019 - |
سؤال
لقد قمت بإعداد جلسة AVCapture، وفي طريقة التفويض، استخدم الكود التالي لمحاولة تعيين نسيج GLKBaseEffect مع الإخراج، ولكن كل ما أحصل عليه هو اللون الأسود.ماذا يجب أن أفعل لجعله يعمل؟
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
effect.texture2d0.name = CVOpenGLESTextureGetName(pixelBuffer);
}
المحلول
تلدر: لا أعتقد أنه يمكنك استخدام إخراج الكاميرا مع GLKBaseEffect
— البيانات من الكاميرا تكون بتنسيق YUV ثنائي المستوى، لذلك تحتاج إلى تظليل جزء مخصص لتحويل ذلك إلى RGB في وقت العرض، و GLKBaseEffect
لا يفعل تظليل مخصص.
يبدو أن هناك بعض الالتباس في واجهة برمجة التطبيقات هنا، لذا تابع القراءة إذا كنت تريد المزيد من المعلومات الأساسية...
رغم ذلك CVOpenGLESTexture
النوع مشتق من CVPixelBuffer
, ، المخازن المؤقتة للصور التي تعود منها CMSampleBufferGetImageBuffer
لا تكون زخارف OpenGL ES تلقائيًا.تحتاج إلى إنشاء أنسجة من مخازن الصور المؤقتة في كل مرة تحصل فيها على إطار من الكاميرا باستخدامه CVOpenGLESTextureCache
.
تفاح GLCameraRipple
يوضح نموذج التعليمات البرمجية كيفية القيام بذلك.إليك نظرة عامة سريعة:
- بعد إعداد سياق GL، سيتم
setupAVCapture
استدعاءات الطريقةCVOpenGLESTextureCacheCreate
لإنشاء ذاكرة تخزين مؤقت للنسيج مرتبطة بهذا السياق. - في
captureOutput:didOutputSampleBuffer:fromConnection:
, ، يحصلون على المخزن المؤقت للصورة من المخزن المؤقت للعينة باستخدامCMSampleBufferGetImageBuffer
, ، ثم أنشئ نسيجي OpenGL ES منه باستخدام ذاكرة التخزين المؤقت للنسيجCVOpenGLESTextureCacheCreateTextureFromImage
وظيفة.أنت بحاجة إلى مادتين لأن المخزن المؤقت للصورة يحتوي على بيانات ألوان YUV في مستويين بت. - يتم ربط كل نسيج بالعرض مباشرة بعد إنشائه، وذلك باستخدام
glBindTexture
.بشكل عام، يمكنك استبدال أglBindTexture
الاتصال مع الإعداد أGLKBaseEffect
'سtexture2d0.name
ويخبره بذلكprepareToDraw
, ، لكنGLKBaseEffect
لا يمكن عرض YUV. - ارسم باستخدام النسيجين المرتبطين، باستخدام برنامج التظليل الذي يقوم تظليل الأجزاء الخاص به أولاً بإنشاء متجه YUV من خلال الجمع بين مكونات من مواد Y وUV، ثم يقوم بضرب مصفوفة بسيطة لتحويلها إلى لون بكسل RGB وفقًا لمواصفات مساحة ألوان HDTV .
نظرًا لأنك تحتاج إلى تظليل جزء مخصص لتحويل YUV إلى RGB، GLKBaseEffect
لن يساعدك.ومع ذلك، كما GLCameraRipple
من العروض النموذجية، فإن التظليل المخصص الذي ستحتاج إلى كتابته ليس مخيفًا إلى هذا الحد.