【发布时间】:2012-09-28 21:04:34
【问题描述】:
我在 OpenGLES 2.0 的简单平面上映射 iPhone 相机输出时遇到问题。由于某种原因,通过CVOpenGLESTextureCacheCreateTextureFromImage 生成的OpenGL 纹理被翻转和旋转。
这是我的情况:我制作了一个 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);
}
}
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);
}
我不包括纹理缓存的初始化和清理,因为这对我的纹理方向问题无关紧要。
关于如何为我的纹理获得正确方向的任何建议?
【问题讨论】: