2012-04-24 16 views
0

これを実現するために、Appleは、CVOpenGLESTextureCacheCreateTextureFromImageを使用しているGLCameraRippleというサンプルを提供しています。しかし、glTexImage2Dに変更すると、何も表示されず、私のコードで何が問題になっていますか?iphone OpenGLESビデオテクスチャ

if (format == kCVPixelFormatType_32BGRA) { 
CVPixelBufferRef pixelBuf = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(pixelBuf, 0); 
void *baseaddress = CVPixelBufferGetBaseAddress(pixelBuf); 

glGenTextures(1, &textureID); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, baseaddress); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

CVPixelBufferUnlockBaseAddress(pixelBuf, 0); 
} 

ありがとうございました!

答えて

1

ここにいくつかの問題があります。まず、GLCameraRippleの例は、BGRAではなくYUVカメラのデータを取り込むように構築されています。あなたの上記のコードは、アプリケーションによって予期される別々のYおよびUV平面ではなく、BGRAデータの1つのテクスチャをアップロードするだけです。色空間変換シェーダを使用してこれらのプレーンを最初のステージとしてマージし、YUVデータを処理する必要があります。

第2に、アップロードしたフレームごとに新しいテクスチャを割り当てています。これは本当に悪い考えです。この方法でリソースを噛んでしまうので、完了したらそのテクスチャを削除しないと、特に悪いことです。アップロードする各プレーンに1度テクスチャを割り当て、各ビデオフレームをアップロードするときにそのテクスチャを保持し、ビデオの処理が完了したときにのみテクスチャを削除する必要があります。

別々のYプレーンとUVプレーンをアップロードするか、カラー処理シェーダを削除/書き直す必要があります。 BGRAのルートに行く場合は、カメラがYUVの代わりにBGRAフレームを提供していることを確認する必要があります。

関連する問題