2011-11-19 78 views
0

我需要創建類型GL_TEXTURE_RECTANGLE_EXT的OpenGL的質感,讓我可以使用如何將CVImageBufferRef轉換爲一個OpenGL紋理

outputImageProviderFromTextureWithPixelFormat:pixelsWide:pixelsHigh:name:flipped:releaseCallback:releaseContext:colorSpace:shouldColorMatch 

,但我無法弄清楚如何我CVImageBufferRef轉換爲OpenGL紋理。我相信我只是沒有找到正確的東西。我如何將CVImageBufferRef轉換爲OpenGL紋理?

當我嘗試:

CVImageBufferRef imageBuffer = CVBufferRetain(mCurrentImageBuffer); 

    GLuint     texture = CVOpenGLTextureGetName(imageBuffer); 


    id provider= [context outputImageProviderFromTextureWithPixelFormat:QCPlugInPixelFormatARGB8 
                  pixelsWide:CVPixelBufferGetWidth(imageBuffer) 
                  pixelsHigh:CVPixelBufferGetHeight(imageBuffer) 
                    name:texture 
                   flipped:NO 
                 releaseCallback:_TextureReleaseCallback 
                 releaseContext:NULL 
                  colorSpace:CVImageBufferGetColorSpace(imageBuffer) 
                 shouldColorMatch:YES]; 

它告訴我, '名稱' 不能爲空。我認爲這是因爲我的imageBuffer是一個像素緩衝區,而不是OpenGL紋理。我怎樣才能從我的像素緩衝區創建一個OpenGL紋理?

回答

0

CoreVideo框架中可能存在一些特殊的快速路徑,但您始終可以獲取原始支持數據並將其提供給glTexImage2D。這裏有一個answered question,它涵蓋了獲取原始數據。

編輯:

挖多一點,看來你也許可以簡單地通過使用CVOpenGLTextureGetTargetCVOpenGLTextureGetName使用已經與CVImageBufferRef相關的OpenGL紋理。這些操作在CVOpenGLTextureRef類型,這是typedef'd CVImageBufferRef

+0

我試過使用CVOpenGLTextureGetName(imageBuffer),它似乎返回null。我得到了'2011-11-20 12:23:52.607 Quartz Composer [18612:407] *** EXCEPTION IGNORED: - [CaptureWithDevice outputImageProviderFromTextureWithPixelFormat:pixelsWide:pixelsHigh:name:flipped:releaseCallback:releaseContext:colorSpace:sh​​ouldColorMatch:]:Argument當我運行它時,「name」不能爲空' – Adam

+0

在閱讀你提到的另一個線程之後,我認爲它返回null的原因是因爲我的imageBuffer不是OpenGL緩衝區。所以,我仍然需要從像素緩衝區轉換一個開放的GL紋理。 – Adam

+0

啊,我明白了。那麼你可以嘗試原始數據路線。不幸的是,我沒有做很多CoreVideo的工作。 – James