我在OpenGLES 2.0中簡單的平面上映射iPhone攝像頭輸出時遇到了問題。出於某種原因,通過CVOpenGLESTextureCacheCreateTextureFromImage
生成的OpenGL紋理被翻轉並旋轉。如何旋轉iPhone攝像頭輸出OpenGLES紋理
這裏是我的情況:我做了一個波前.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重碼)。
這是我的代碼:它的一些靈感來源於Brad Larson的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);
}
我不包括初始化並清理紋理緩存,因爲這對我的紋理方向問題無關緊要。
關於如何獲得正確的紋理方向的任何建議?
謝謝您的回答。飛機.obj文件只是爲了讓我的問題簡短。實際的形狀是一個更復雜的半球狀物體。我也在尋找OpenGL 2.0解決方案。 – polyclick 2012-08-07 10:02:59
我認爲你有2個選擇。 第一:您實時翻轉圖像。這是非常昂貴的,有時可能會成爲演出的一個問題。 其次:您翻轉四邊形紋理的座標。 – 2012-08-07 10:11:54
我正在嘗試將相機輸入渲染到新紋理並將該紋理應用到對象。如果解決問題,我會告訴你;) – polyclick 2012-08-07 10:23:15