在用于iOs的OpenGL ES2.0中,如何使用CVPixelBufferRef更新立方体贴图纹理?

时间:2012-10-25 23:56:22

标签: ios5 opengl-es ios6 opengl-es-2.0

我设法从AVPlayer获取CVPixelBufferRef来提供可用于纹理2D对象的像素数据。当我的pixelbuffer中包含数据时,我会这样做:

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);

但OpenGl ES2.0 for iOS不支持令人难以置信的GL_UNPACK_ROW_LENGTH。

那么,是吗:

- 在使用缓冲区制作纹理之前,通过将缓冲区索引到某个像素子集,可以将我的CVPixelBufferRef中的像素数据拆分为什么?

- 任何方法可以将6个新的GL_TEXTURE_2D作为我的GL_TEXTURE_2D的索引子集,由上面的代码创建

- 将GL_TEXTURE_2D转换为有效的GL_TEXTURE_CUBE_MAP的任何方式(例如,GLKit具有从单个cubetrip文件加载GL_TEXTURE_CUBE_MAP的Skybox效果。它没有从内存加载纹理的方法,或者我将被排序)< / p>

- 其他想法?

1 个答案:

答案 0 :(得分:1)

如果不可能以任何其他方式(这可能是不可能的,可能有另一种方式 - 所以这可能不是最好的答案而且涉及更多的工作而不是必要的)这里是我试过的黑客攻击:

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

上面的方法实际上与我正在为应用程序做的非常类似,除了我只是使用投影纹理来屏蔽&amp; amp;替换立方体贴图的一小部分。我需要对我正在投影的小方块的边缘进行像素匹配,以便它无缝地应用于天空盒,这就是为什么我相信这种方法实际上会重现立方体贴图行为的原因 - 否则,像素匹配就不会是可能的。

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