我已经设法从 AVPlayer 获取 CVPixelBufferRef 来提供像素数据,我可以使用这些数据来纹理 2D 对象。当我的像素缓冲区中有数据时,我会:
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 设置解包,然后从像素缓冲区中读取:
glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, X);
glPixelStorei(GL_UNPACK_SKIP_ROWS, Y);
glTexImage2D(...,&pixelbuffer);
但令人难以置信的是 GL_UNPACK_ROW_LENGTH 在 iOS 的 OpenGl ES2.0 中不受支持。
那么,有没有:
- 在使用缓冲区制作纹理之前,有什么方法可以通过将缓冲区索引到某个像素子集来拆分我们 CVPixelBufferRef 中的像素数据?
- 将 6 个新的 GL_TEXTURE_2D 作为上面代码创建的我的 GL_TEXTURE_2D 的索引子集的任何方法
- 将 GL_TEXTURE_2D 转换为有效 GL_TEXTURE_CUBE_MAP 的任何方法(例如,GLKit 具有从单个立方体文件加载 GL_TEXTURE_CUBE_MAP 的天空盒效果。它没有从内存加载纹理的方法,否则我会被排序)
-还有其他想法吗?