OpenGLES2.0の単純な平面にiPhoneカメラの出力をマッピングするのに問題があります。何らかの理由で、を介して生成されたOpenGLテクスチャCVOpenGLESTextureCacheCreateTextureFromImage
が反転および回転されます。
これが私の状況です。この単純な平面オブジェクトを解析するWavefront.objローダーを作成しました。
v -0.5 -0.5 0
v 0.5 -0.5 0
v -0.5 0.5 0
v 0.5 0.5 0
vt 0 0 0
vt 1 0 0
vt 0 1 0
vt 1 1 0
f 4/4 3/3 1/1
f 2/2 4/4 1/1
私に関する限り、テクスチャマッピングは必要に応じて機能します。単純なpng画像を平面にマッピングすることでこれを確認しました。正しく表示されます。
(記録のために:iPhoneの座標系に画像をロードし、OpenGLの左上のテクスチャ座標系に一致するように画像のピクセルを反転し、すべてをマッピングしました)。結果:動作します!
したがって、コードを少しシャッフルし、カメラのピクセルバッファをテクスチャユニットにフィードした後、問題が発生します(または、これは意図された動作であり、何らかの方法でそれに対抗する必要がありますか? CPUの重いコードではありません)。
これが私のコードです。その一部は、BradLarsonのColorTrackingの例とAppleのGLCameraRippleの例に触発されています。
出力をキャプチャするコード:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
[self.delegate processNewCameraFrame:pixelBuffer];
}
画像バッファ参照を通過した後、ここで終了します:
- (void)updateCameraFrame:(CVImageBufferRef)pCameraFrame
{
if(cameraTextureMaterial)
{
cameraTextureMaterial->updateWithCameraFrame(pCameraFrame);
}
}
CamerTextureMaterial:
void CameraTextureMaterial::updateWithCameraFrame(CVImageBufferRef pixelBuffer)
{
if(!_videoTextureCache)
{
cout << "No video texture cache" << endl;
return;
}
cleanup();
CVReturn err;
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
glActiveTexture(GL_TEXTURE0);
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
_videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
width,
height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&_lumaTexture);
if (err)
{
cout << "Error at CVOpenGLESTextureCacheCreateTextureFromImage" << endl;
}
glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
テクスチャの向きの問題には関係ないため、テクスチャキャッシュの初期化とクリーンアップを除外しています。
テクスチャの正しい向きを取得する方法について何か提案はありますか?