在OpenGL中将YUV纹理数据推送到GPU上最有效的过程是什么?

在OpenGL中将YUV纹理数据推送到GPU上最有效的过程是什么?,opengl,opengl-es,h.264,Opengl,Opengl Es,H.264,有没有人知道一种有效的方法可以将2vuy非平面数据以不需要滑动的方式推送到GPU上 我从h264视频文件中获取原始2vuy数据,并将其成功加载到纹理中,然后映射到OpenGL对象。我注意到我的代码在glgProcessPixelsWithProcessor中花费了相当多的时间。我的glTexImage2D调用如下所示: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_YCBCR_422_APPLE, GL_UNS

有没有人知道一种有效的方法可以将2vuy非平面数据以不需要滑动的方式推送到GPU上

我从h264视频文件中获取原始2vuy数据,并将其成功加载到纹理中,然后映射到OpenGL对象。我注意到我的代码在
glgProcessPixelsWithProcessor
中花费了相当多的时间。我的
glTexImage2D
调用如下所示:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_YCBCR_422_APPLE,
    GL_UNSIGNED_SHORT_8_8_APPLE, data);
苹果在其OpenGL指南中称,苹果提供了“可接受”的性能(第103页),但

注意:如果您的数据只需要Swizzle,
glgProcessPixels
执行swizzling的速度相当快,尽管不如数据不需要swizzling时快。但是,非本机数据格式一次转换一个字节,并产生最好避免的性能成本

我假设CPU上正在进行某种内部格式转换。我在另一个线程中注意到,
glgProcessPixels
也在运行块方法


我的路径是最有效的吗?如果不是,那是什么?

您的代码目前的状态取决于Apple的扩展。我不知道里面发生了什么

然而,我的建议是,创建三个2D纹理,每个纹理正好有一个通道,每个纹理接收一个颜色平面;使用独立纹理使支持色度子采样(即422)变得更简单


然后在着色器中执行颜色空间转换。当写下数学时,我建议您通过接触颜色空间(如XYZ)来完成,因为这允许您考虑输出设备的颜色配置文件;ICC配置文件提供了从XYZ颜色空间坐标到设备颜色空间(RGB)坐标的转换数据。

您的代码目前的状态取决于Apple的扩展。我不知道里面发生了什么

然而,我的建议是,创建三个2D纹理,每个纹理正好有一个通道,每个纹理接收一个颜色平面;使用独立纹理使支持色度子采样(即422)变得更简单


然后在着色器中执行颜色空间转换。当写下数学时,我建议您通过接触颜色空间(如XYZ)来完成,因为这允许您考虑输出设备的颜色配置文件;ICC配置文件提供从XYZ颜色空间坐标到设备颜色空间(RGB)坐标的转换数据。

您询问的是桌面OpenGL或OpenGL ES?您询问的是桌面OpenGL或OpenGL ES?我将OSX CVPixelBufferRef的基址作为我的数据传递。我可以成功地查看帧。我只是尽可能简单地传递我的2vuy缓冲区。我考虑过多个纹理,我认为将2vuy分割成3个平面比OSX opengl执行的离线转换要快。我有一个2vuy缓冲区,我认为是uy0vy2(或cby0cry1)(根据苹果的一篇网络帖子)。所以理论上我可以迭代我的缓冲区,抓取每一个字节,有一个黑白缓冲区,我可以作为纹理上的数据源传入。正确吗?我创建了一个Y数据缓冲区,并将其传入“GLTEXAGE2D(GL_纹理_2D,0,GL_红色,宽度,高度,0,GL_红色,GL_无符号字节,yDATA)”。理论上,我应该能够访问着色器中的红色部分,但所有内容都变为黑色。我可以确认字节顺序为uy1 V Y2,因为我可以从我创建的Y数据缓冲区生成png,因此,我现在面临的挑战是找出如何将灰度缓冲区作为着色器纹理中的组件传递。是否禁用了mipmapping<代码>glTexParameteri(GL_纹理\u 2D、GL_纹理\u最小\u过滤器、GL_线性)我将OSX CVPixelBufferRef的基址作为数据传递。我可以成功地查看帧。我只是尽可能简单地传递我的2vuy缓冲区。我考虑过多个纹理,我认为将2vuy分割成3个平面比OSX opengl执行的离线转换要快。我有一个2vuy缓冲区,我认为是uy0vy2(或cby0cry1)(根据苹果的一篇网络帖子)。所以理论上我可以迭代我的缓冲区,抓取每一个字节,有一个黑白缓冲区,我可以作为纹理上的数据源传入。正确吗?我创建了一个Y数据缓冲区,并将其传入“GLTEXAGE2D(GL_纹理_2D,0,GL_红色,宽度,高度,0,GL_红色,GL_无符号字节,yDATA)”。理论上,我应该能够访问着色器中的红色部分,但所有内容都变为黑色。我可以确认字节顺序为uy1 V Y2,因为我可以从我创建的Y数据缓冲区生成png,因此,我现在面临的挑战是找出如何将灰度缓冲区作为着色器纹理中的组件传递。是否禁用了mipmapping<代码>glTexParameteri(GL_纹理\u 2D、GL_纹理\u最小\u过滤器、GL_线性)