Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 核心视频像素缓冲区为GL_纹理_2D_Macos_Opengl_Core Video - Fatal编程技术网

Macos 核心视频像素缓冲区为GL_纹理_2D

Macos 核心视频像素缓冲区为GL_纹理_2D,macos,opengl,core-video,Macos,Opengl,Core Video,所以我已经设置了CVPixelBuffer,并在iOS上成功地将它们绑定到OpenGL FBO。但现在,在OSX上尝试同样的方法让我陷入了困境 CVOpenGLTextureCacheCreateTextureFromImage中的纹理返回为GL_纹理_矩形,而不是GL_纹理_2D目标 我找到了kCVOpenGLBufferTarget键,但它似乎应该与CVOpenGLBufferCreate一起使用,而不是与CVPixelBufferCreate一起使用 使用CVPixelBufferCrea

所以我已经设置了CVPixelBuffer,并在iOS上成功地将它们绑定到OpenGL FBO。但现在,在OSX上尝试同样的方法让我陷入了困境

CVOpenGLTextureCacheCreateTextureFromImage中的纹理返回为GL_纹理_矩形,而不是GL_纹理_2D目标

我找到了kCVOpenGLBufferTarget键,但它似乎应该与CVOpenGLBufferCreate一起使用,而不是与CVPixelBufferCreate一起使用

使用CVPixelBufferCreate在OSX上获得GL_纹理_2D目标纹理是否可能?如果可能,如何实现

FWIW CV PBO设置列表:

NSDictionary *bufferAttributes = @{ (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA), (__bridge NSString *)kCVPixelBufferWidthKey : @(size.width), (__bridge NSString *)kCVPixelBufferHeightKey : @(size.height), (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ } };

if (pool)
{
    error = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, pool, &renderTarget);
}
else
{
    error = CVPixelBufferCreate(kCFAllocatorDefault, (NSUInteger)size.width, (NSUInteger)size.height, kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)bufferAttributes, &renderTarget);
}

ZAssert(!error, @"Couldn't create pixel buffer");

error = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, NULL, [[NSOpenGLContext context] CGLContextObj], [[NSOpenGLContext format] CGLPixelFormatObj], NULL, &textureCache);
ZAssert(!error, @"Could not create texture cache.");

error = CVOpenGLTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, renderTarget, NULL, &renderTexture);
ZAssert(!error, @"Couldn't create a texture from cache.");

GLuint reference = CVOpenGLTextureGetName(renderTexture);
GLenum target = CVOpenGLTextureGetTarget(renderTexture);
更新:我已经能够成功地使用生成的GL_纹理_矩形纹理。但是,这会导致着色器在iOS和OSX之间的兼容性方面出现很多问题。无论如何,我宁愿继续使用归一化纹理坐标


如果无法以这种方式直接从CVPixelBuffer获取GL_TEXTURE_2D纹理,是否可以创建CVOpenGLBuffer并将CVPixelBuffer连接到它以提取像素数据?

,因为这似乎一直悬而未决,并且是我最近处理的问题:不,
GL_纹理_矩形
似乎是唯一的用例。要获得
GL\u纹理\u 2D
您必须渲染到纹理。

刚刚遇到这个问题,我将回答它,即使它很旧,以防其他人遇到它

iOS使用OpenGL ES(最初是2.0,然后是3.0)。OSX使用常规的旧(非ES)OpenGL,可以选择核心配置文件(仅3.0+版本)或兼容性配置文件(最多3.2版本)

这里的区别在于OpenGL(非ES)是很久以前设计的,当时对纹理大小有很多限制。随着卡片取消了这些限制,增加了扩展,包括GL_纹理_矩形。现在,对于任何GPU来说,支持任何大小的纹理都没有什么大不了的,但是出于API兼容性的原因,他们无法真正修复OpenGL。由于OpenGL ES在技术上是一个并行但独立的API,它是最近设计的,所以他们能够从一开始就纠正这个问题(也就是说,他们从来不用担心打破旧东西)。因此,对于OpenGL ES,他们从未定义过GL_纹理_矩形,他们只是定义了GL_纹理_2D没有大小限制

简短回答-OS X使用桌面OpenGL,出于传统兼容性原因,它仍然单独处理矩形纹理,而iOS使用OpenGL ES,它对GL_纹理_2D没有大小限制,因此根本不提供GL_纹理_矩形。因此,在OS X上,CoreVideo生成GL_纹理_矩形对象,因为GL_纹理_2D会浪费大量内存,而在iOS上,它生成GL_纹理_2D对象,因为GL_纹理_矩形不存在,也不需要


不幸的是,OpenGL和OpenGL ES之间不兼容,但事实就是这样,除了围绕它编写代码外,别无选择。或者,现在,你可以(也可能应该考虑)转向金属。

你使用的是核心配置文件吗?因为直到你提到它之前我都不知道它是什么。。。可能没有。好吧,我没有使用3.2内核配置文件。即使是现在,Core Video仍然使用GL#u TEXTURE_RECTANGLE作为目标。我应该注意,#import会导致编译器警告“GL.h和gl3.h都包含在内”。这表明Core Video对我来说没有使用3.2 Core配置文件。我认为如果使用Core配置文件,它将使用GL#u TEXTURE_2D,至少在iOS上是这样。支持3.2与es 2.0兼容,es 2.0在TEXTURE_2Meta comment中支持矩形纹理:我从一开始就将其标记为社区wiki,因为所有这些都是三年前在评论中声明或暗示的,但最好将其正式化为答案。