我在 OpenGLES 2.0 中的一个简单平面上映射 iPhone 相机输出时遇到问题。由于某种原因,通过 OpenGL 生成的纹理CVOpenGLESTextureCacheCreateTextureFromImage
被翻转和旋转。
这是我的情况:我制作了一个解析这个简单平面对象的 Wavefront .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];
}
在传递图像缓冲区 ref 之后,它会在这里结束:
- (void)updateCameraFrame:(CVImageBufferRef)pCameraFrame
{
if(cameraTextureMaterial)
{
cameraTextureMaterial->updateWithCameraFrame(pCameraFrame);
}
}
CamerTexture材质:
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);
}
我不包括纹理缓存的初始化和清理,因为这对我的纹理方向问题无关紧要。
关于如何为我的纹理获得正确方向的任何建议?