2012-04-24 159 views
0

我知道蘋果提供了一個名爲GLCameraRipple的示例,它使用CVOpenGLESTextureCacheCreateTextureFromImage來實現此目的。但是當我更改爲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的例子是爲了拍攝YUV相機數據,而不是BGRA。您的上述代碼僅上傳一個BGRA數據紋理,而不是應用程序預期的單獨Y和UV平面。它使用色彩空間轉換着色器將這些平面合併爲第一階段,並且需要YUV數據才能工作。

其次,你爲每個上傳的幀分配一個新的紋理,這是一個非常糟糕的主意。如果您在完成時不刪除該紋理,這是特別糟糕的,因爲您會以這種方式咀嚼資源。您應該爲每個要上傳的平面分配一次紋理,然後在上傳每個視頻幀時保留該紋理,只有在處理完視頻後才刪除。

您需要重做上述內容以上傳單獨的Y和UV平面,或者刪除/重寫其顏色處理着色器。如果你走BGRA路線,你還需要確保攝像頭現在給你BGRA幀而不是YUV幀。