2012-10-25 20 views
1

我设法从AVPlayer获取CVPixelBufferRef来提供可用于纹理2D对象的像素数据。当我pixelbuffer中有数据我做的:在用于iOs的OpenGL ES2.0中,如何使用CVPixelBufferRef更新立方体贴图纹理?

CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(' 
kCFAllocatorDefault, 
    videoTextureCache_, 
    pixelBuffer, //this is a CVPixelBufferRef 
    NULL, 
    GL_TEXTURE_2D, 
    GL_RGBA, 
    frameWidth, 
    frameHeight, 
    GL_BGRA, 
    GL_UNSIGNED_BYTE, 
    0, 
    &texture); 

我想用这个缓冲区创建GL_TEXTURE_CUBE_MAP。我的视频帧数据实际上是一个图像中的6个部分(例如一个立方体条),它们总体上构成立方体的两侧。任何想法在这样做?

我原本以为只是假装我GL_TEXTURE_2D是GL_TEXTURE_CUBE_MAP和替换我的天空盒由上面的代码生成的纹理质感,但是这创造了一种扭曲的混乱(我想试图迫使一个天空盒时,应预期用一个GL_TEXTURE_2D进行纹理

另一个想法是建立使用glPixelStorei然后从pixelbuffur读解压缩:。

glPixelStorei(GL_UNPACK_ROW_LENGTH, width); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, X); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, Y); 
glTexImage2D(...,&pixelbuffer); 

但令人难以置信的GL_UNPACK_ROW_LENGTH没有在OpenGL ES2.0的iOS支持

所以,有:

- 任何方式来分裂我们的像素数据在我的CVPixelBufferRef通过索引缓冲区的一些像素子集之前使用它来使纹理?

-Any方法,使6个新GL_TEXTURE_2D为由代码中创建上述

- 任何方式到GL_TEXTURE_2D转换为有效GL_TEXTURE_CUBE_MAP我GL_TEXTURE_2D的索引子集(例如GLKit有空中包厢效果负荷一个GL_TEXTURE_CUBE_MAP来自一个单独的cubestrip文件,它没有从内存中加载纹理的方法,或者我将被排序)

- 其他想法?

回答

1

如果它是不可能的任何其他方式(这是不可能的,有可能是一种替代方法 - 所以这可能不是最好的答案&涉及超过必要的工作),这里是一个黑客我想尝试:

立方体贴图的工作方式是将每个面的纹理从几何体中心的一个点投射到每个立方体面。所以你可以自己重现那种行为;您可以使用投影纹理进行六次绘制调用,其中一个用于多维数据集的每个面。每次,您首先将您感兴趣的人脸绘制到模板缓冲区,然后计算您的纹理的投影矩阵(该技术在游戏中被用于“聚光灯效果”),然后找出变换矩阵需要扩充片段着色器的纹理读取,以便对于每个面,只有与该面对应的纹理部分在(0..1)纹理查找范围内卷曲。如果一切顺利,超出0..1范围的任何东西都应该被模板缓冲区丢弃,并且您将留下TEXTURE_2D以外的DIY立方体贴图。

上面的方法实际上与我现在正在为应用做的非常相似,除了我只使用投影纹理掩盖&替换了立方体贴图的一小部分。我需要像素匹配我投影的小方块的边缘,以便将其无缝应用到天空盒,这就是为什么我确信这种方法实际上会重现立方体贴图的行为 - 否则,像素匹配不会实现,不可能。

无论如何,我希望你找到一种简单的将你的2D转换到CUBEMAP的方法,因为这可能会更容易和更清晰。

+0

感谢您花时间回答。你的建议听起来在技术上是可行的。我将尝试其他一些事情,包括将pixelbuffer视为纹理图集,并可能只是编写自定义着色器以将单个图像映射到多维数据集。 – 3leggedcheetah

+0

我认为这基本上是我的建议;减去投影纹理位。无论如何,当我考虑它时,我不确定是否需要投影纹理或不要求立方体贴图效果。我有一个预感,但没有足够的经验足以说明它没有原型。我觉得应该有一种更好的方式来处理数据,以便给你留下适当的立方体贴图,但可惜我在这里没有帮助。 – jankins

相关问题