0

私はアップルがこれを達成するためにCVOpenGLESTextureCacheCreateTextureFromImageを使用しているGLCameraRippleと呼ばれるサンプルを提供していることを知っています。しかし、glTexImage2Dに変更すると、何も表示されません。コードの何が問題になっていますか?

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);
}

助けてくれてありがとう!

4

1 に答える 1

1

ここにはいくつかの問題があります。まず、GLCameraRippleの例は、BGRAではなくYUVカメラデータを取り込むために作成されました。上記のコードは、アプリケーションで期待される個別のY平面とUV平面ではなく、BGRAデータの1つのテクスチャのみをアップロードしています。色空間変換シェーダーを使用して、これらの平面を最初のステージとしてマージします。これには、YUVデータが機能する必要があります。

次に、アップロードされたフレームごとに新しいテクスチャを割り当てますが、これは非常に悪い考えです。この方法でリソースをかみ砕くため、完了時にそのテクスチャを削除しない場合、これは特に悪いことです。アップロードする平面ごとにテクスチャを1回割り当ててから、各ビデオフレームをアップロードするときにそのテクスチャを保持し、ビデオの処理が完了したときにのみテクスチャを削除する必要があります。

上記をやり直して、個別のY平面とUV平面をアップロードするか、それらのカラー処理シェーダーを削除/書き換える必要があります。BGRAルートを使用する場合は、カメラがYUVフレームではなくBGRAフレームを提供していることも確認する必要があります。

于 2012-04-24T16:40:59.210 に答える