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

Ios5 在OpenGL ES2.0 for iOs中,如何使用CVPixelBufferRef更新立方体贴图纹理?,ios5,opengl-es,ios6,opengl-es-2.0,Ios5,Opengl Es,Ios6,Opengl Es 2.0,我已经设法从AVPlayer获得了一个CVPixelBufferRef,以提供像素数据,我可以使用这些数据对2D对象进行纹理处理。当我的像素缓冲区中有数据时,我会: CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(' kCFAllocatorDefault, videoTextureCache_, pixelBuffer, //this is a CVPixelBufferRef NULL, GL_TEXTU

我已经设法从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_纹理_立方体_贴图。我的视频帧数据实际上是一幅图像中的6个部分(例如,一个立方体),这总共构成了一个立方体的侧面。有什么想法吗

我原以为我的GL_纹理_2D是一个GL_纹理_立方体_贴图,然后用上面代码生成的纹理替换skybox上的纹理,但这会造成扭曲的混乱(我认为在尝试使用GL_纹理_2D对skybox进行纹理处理时,这应该是意料之中的)

另一个想法是使用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_解包_行长度

那么,有没有:

-在使用缓冲区生成纹理之前,是否可以通过将缓冲区索引到某个像素子集来分割CVPixelBufferRef中的像素数据

-有没有办法将6个新的GL_纹理_2D作为由上述代码创建的我的GL_纹理_2D的索引子集

-将GL_纹理_2D转换为有效GL_纹理_立方体_贴图的任何方法(例如,GLKit具有从单个立方体贴图文件加载GL_纹理_立方体_贴图的天空盒效果。它没有从内存加载纹理的方法,否则我将被排序)


-还有其他想法吗?

如果其他方法不可行(这不太可能,可能有另一种方法——因此这可能不是最好的答案,需要做的工作比必要的多),我会尝试以下方法:

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

上面的方法实际上与我现在为一个应用程序所做的非常相似,只是我只使用投影纹理来遮罩和替换立方体贴图的一小部分。我需要像素匹配我投影的小正方形的边缘,以便它无缝地应用于skybox,所以我相信这种方法可以我将实际复制立方体贴图行为——否则,像素匹配将不可能


无论如何,我希望您能找到一种简单地将2D转换为立方体贴图的方法,因为这可能会更简单、更干净。

如果其他方法不可能实现(这不太可能,可能有另一种方法——因此这可能不是最好的答案,需要做的工作比必要的多),我会尝试以下一种方法:

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

上面的方法实际上与我现在为一个应用程序所做的非常相似,只是我只使用投影纹理来遮罩和替换立方体贴图的一小部分。我需要像素匹配我投影的小正方形的边缘,以便它无缝地应用于skybox,所以我相信这种方法可以我将实际复制立方体贴图行为——否则,像素匹配将不可能


无论如何,我希望您能找到一种简单的方法,将2D转换为立方体贴图,因为这样可能会更简单、更清晰。

感谢您花时间回答。您的建议听起来在技术上是可行的。我将尝试其他一些方法,包括将pixelbuffer视为纹理图集,可能只是编写一个自定义着色器将单个图像映射到立方体。我认为这基本上是我的建议;减去投影纹理。无论如何,在我思考的过程中,我不确定是否需要投影纹理来获得立方体贴图效果。我有一种预感,它会,但没有足够的经验在没有原型的情况下肯定。我觉得应该有这是一种更好的处理数据的方法,可以为您提供一个合适的立方体贴图,但遗憾的是我在这方面没有帮助。感谢您花时间回答。您的建议听起来在技术上是可行的。我将尝试其他一些事情,包括将pixelbuffer视为纹理图集,可能只是编写一个自定义着色器来映射单个imag我想这基本上是我的建议;减去投影纹理。无论如何,在我思考的过程中,我不确定是否需要投影纹理来获得立方体贴图效果。我有预感它会,但不是