我设法从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文件,它没有从内存中加载纹理的方法,或者我将被排序)
- 其他想法?
感谢您花时间回答。你的建议听起来在技术上是可行的。我将尝试其他一些事情,包括将pixelbuffer视为纹理图集,并可能只是编写自定义着色器以将单个图像映射到多维数据集。 – 3leggedcheetah
我认为这基本上是我的建议;减去投影纹理位。无论如何,当我考虑它时,我不确定是否需要投影纹理或不要求立方体贴图效果。我有一个预感,但没有足够的经验足以说明它没有原型。我觉得应该有一种更好的方式来处理数据,以便给你留下适当的立方体贴图,但可惜我在这里没有帮助。 – jankins