区块链技术博客
www.b2bchain.cn

在视图中实现Metal和OpenGL交叉渲染求职学习资料

本文介绍了在视图中实现Metal和OpenGL交叉渲染求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

Mixing Metal and OpenGL Rendering in a View | Apple Developer Documentation

使用可互操作的纹理在同一视图中使用Metal和OpenGL进行绘制。

概述

如果正在开发一个新的程序,并将传统的OpenGL代码迁移到Metal上,可互操作的(interoperable)纹理可以让你轻松实时查看结果。

可以通过初始化一个作为可互操作纹理CVPixelBuffer,把Metal或OpenGL内容渲染到任一视图中。当你启用pixel buffer的OpenGL和Metal兼容性标志时,纹理能够被绘制到任意一种渲染技术中并由其完成显示。

如果你正在使用已部署的程序,可互操作的纹理让你可以在整个移植过程中实现增量更新。

入门

使用Metal和OpenGL的可互操作需要macOS 10.13及更高版本或iOS 11及更高版本。

选择兼容的像素格式

要创建一个可互操作的纹理,选择一个Core Video像素格式,一个Metal像素格式,以及OpenGL内部格式,这些格式相互兼容。本示例为你提供了一个预加载的兼容性选项表,并根据所需的Metal格式进行选择:

for(int i = 0; i < AAPLNumInteropFormats; i++) {     if(pixelFormat == AAPLInteropFormatTable[i].mtlFormat) {         return &AAPLInteropFormatTable[i];     } }

创建可互操作的纹理

使用CVPixelBuffer作为可互操作的纹理,可是实现在两个渲染器之间实现同步的内存共享。要创建CVPixelBuffer,需要提供Core Video像素格式,并启用OpenGL和Metal兼容性选项:

NSDictionary* cvBufferProperties = @{     (__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,     (__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES, }; CVReturn cvret = CVPixelBufferCreate(kCFAllocatorDefault,                         size.width, size.height,                         _formatInfo->cvPixelFormat,                         (__bridge CFDictionaryRef)cvBufferProperties,                         &_CVPixelBuffer);

对于macOS,从pixel buffer创建OpenGL纹理

首先从pixel buffer创建一个OpenGL Core Video纹理缓存:

cvret  = CVOpenGLTextureCacheCreate(                 kCFAllocatorDefault,                 nil,                 _openGLContext.CGLContextObj,                 _CGLPixelFormat,                 nil,                 &_CVGLTextureCache);

然后,从纹理缓存中创建一个CVPixelBuffer OpenGL纹理图形:

cvret = CVOpenGLTextureCacheCreateTextureFromImage(                 kCFAllocatorDefault,                 _CVGLTextureCache,                 _CVPixelBuffer,                 nil,                 &_CVGLTexture);

最后,从CVPixelBufferOpenGL纹理图像中获取一个OpenGL纹理名称:

_openGLTexture = CVOpenGLTextureGetName(_CVGLTexture);

对于iOS,从pixel buffer创建OpenGL ES纹理

首先从pixel buffer创建一个OpenGL ES Core Video纹理缓存:

cvret = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault,                 nil,                 _openGLContext,                 nil,                 &_CVGLTextureCache);

然后,从纹理缓存中创建一个CVPixelBuffer OpenGL ES纹理图像:

cvret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,                 _CVGLTextureCache,                 _CVPixelBuffer,                 nil,                 GL_TEXTURE_2D,                 _formatInfo->glInternalFormat,                 _size.width, _size.height,                 _formatInfo->glFormat,                 _formatInfo->glType,                 0,                 &_CVGLTexture);

最后,从CVPixelBuffer OpenGL ES纹理图像中获取OpenGL ES纹理名称:

_openGLTexture = CVOpenGLESTextureGetName(_CVGLTexture);

从pixel buffer创建Metal纹理

首先实例化一个Metal纹理缓存,如下所示:

cvret = CVMetalTextureCacheCreate(                 kCFAllocatorDefault,                 nil,                 _metalDevice,                 nil,                 &_CVMTLTextureCache);

Mixing Metal and OpenGL Rendering in a View | Apple Developer Documentation

使用可互操作的纹理在同一视图中使用Metal和OpenGL进行绘制。

概述

如果正在开发一个新的程序,并将传统的OpenGL代码迁移到Metal上,可互操作的(interoperable)纹理可以让你轻松实时查看结果。

可以通过初始化一个作为可互操作纹理CVPixelBuffer,把Metal或OpenGL内容渲染到任一视图中。当你启用pixel buffer的OpenGL和Metal兼容性标志时,纹理能够被绘制到任意一种渲染技术中并由其完成显示。

如果你正在使用已部署的程序,可互操作的纹理让你可以在整个移植过程中实现增量更新。

入门

使用Metal和OpenGL的可互操作需要macOS 10.13及更高版本或iOS 11及更高版本。

选择兼容的像素格式

要创建一个可互操作的纹理,选择一个Core Video像素格式,一个Metal像素格式,以及OpenGL内部格式,这些格式相互兼容。本示例为你提供了一个预加载的兼容性选项表,并根据所需的Metal格式进行选择:

for(int i = 0; i < AAPLNumInteropFormats; i++) {     if(pixelFormat == AAPLInteropFormatTable[i].mtlFormat) {         return &AAPLInteropFormatTable[i];     } }

创建可互操作的纹理

使用CVPixelBuffer作为可互操作的纹理,可是实现在两个渲染器之间实现同步的内存共享。要创建CVPixelBuffer,需要提供Core Video像素格式,并启用OpenGL和Metal兼容性选项:

NSDictionary* cvBufferProperties = @{     (__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,     (__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES, }; CVReturn cvret = CVPixelBufferCreate(kCFAllocatorDefault,                         size.width, size.height,                         _formatInfo->cvPixelFormat,                         (__bridge CFDictionaryRef)cvBufferProperties,                         &_CVPixelBuffer);

对于macOS,从pixel buffer创建OpenGL纹理

首先从pixel buffer创建一个OpenGL Core Video纹理缓存:

cvret  = CVOpenGLTextureCacheCreate(                 kCFAllocatorDefault,                 nil,                 _openGLContext.CGLContextObj,                 _CGLPixelFormat,                 nil,                 &_CVGLTextureCache);

然后,从纹理缓存中创建一个CVPixelBuffer OpenGL纹理图形:

cvret = CVOpenGLTextureCacheCreateTextureFromImage(                 kCFAllocatorDefault,                 _CVGLTextureCache,                 _CVPixelBuffer,                 nil,                 &_CVGLTexture);

最后,从CVPixelBufferOpenGL纹理图像中获取一个OpenGL纹理名称:

_openGLTexture = CVOpenGLTextureGetName(_CVGLTexture);

对于iOS,从pixel buffer创建OpenGL ES纹理

首先从pixel buffer创建一个OpenGL ES Core Video纹理缓存:

cvret = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault,                 nil,                 _openGLContext,                 nil,                 &_CVGLTextureCache);

然后,从纹理缓存中创建一个CVPixelBuffer OpenGL ES纹理图像:

cvret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,                 _CVGLTextureCache,                 _CVPixelBuffer,                 nil,                 GL_TEXTURE_2D,                 _formatInfo->glInternalFormat,                 _size.width, _size.height,                 _formatInfo->glFormat,                 _formatInfo->glType,                 0,                 &_CVGLTexture);

最后,从CVPixelBuffer OpenGL ES纹理图像中获取OpenGL ES纹理名称:

_openGLTexture = CVOpenGLESTextureGetName(_CVGLTexture);

从pixel buffer创建Metal纹理

首先实例化一个Metal纹理缓存,如下所示:

cvret = CVMetalTextureCacheCreate(                 kCFAllocatorDefault,                 nil,                 _metalDevice,                 nil,                 &_CVMTLTextureCache);

Mixing Metal and OpenGL Rendering in a View | Apple Developer Documentation

使用可互操作的纹理在同一视图中使用Metal和OpenGL进行绘制。

概述

如果正在开发一个新的程序,并将传统的OpenGL代码迁移到Metal上,可互操作的(interoperable)纹理可以让你轻松实时查看结果。

可以通过初始化一个作为可互操作纹理CVPixelBuffer,把Metal或OpenGL内容渲染到任一视图中。当你启用pixel buffer的OpenGL和Metal兼容性标志时,纹理能够被绘制到任意一种渲染技术中并由其完成显示。

如果你正在使用已部署的程序,可互操作的纹理让你可以在整个移植过程中实现增量更新。

入门

使用Metal和OpenGL的可互操作需要macOS 10.13及更高版本或iOS 11及更高版本。

选择兼容的像素格式

要创建一个可互操作的纹理,选择一个Core Video像素格式,一个Metal像素格式,以及OpenGL内部格式,这些格式相互兼容。本示例为你提供了一个预加载的兼容性选项表,并根据所需的Metal格式进行选择:

for(int i = 0; i < AAPLNumInteropFormats; i++) {     if(pixelFormat == AAPLInteropFormatTable[i].mtlFormat) {         return &AAPLInteropFormatTable[i];     } }

创建可互操作的纹理

使用CVPixelBuffer作为可互操作的纹理,可是实现在两个渲染器之间实现同步的内存共享。要创建CVPixelBuffer,需要提供Core Video像素格式,并启用OpenGL和Metal兼容性选项:

NSDictionary* cvBufferProperties = @{     (__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,     (__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES, }; CVReturn cvret = CVPixelBufferCreate(kCFAllocatorDefault,                         size.width, size.height,                         _formatInfo->cvPixelFormat,                         (__bridge CFDictionaryRef)cvBufferProperties,                         &_CVPixelBuffer);

对于macOS,从pixel buffer创建OpenGL纹理

首先从pixel buffer创建一个OpenGL Core Video纹理缓存:

cvret  = CVOpenGLTextureCacheCreate(                 kCFAllocatorDefault,                 nil,                 _openGLContext.CGLContextObj,                 _CGLPixelFormat,                 nil,                 &_CVGLTextureCache);

然后,从纹理缓存中创建一个CVPixelBuffer OpenGL纹理图形:

cvret = CVOpenGLTextureCacheCreateTextureFromImage(                 kCFAllocatorDefault,                 _CVGLTextureCache,                 _CVPixelBuffer,                 nil,                 &_CVGLTexture);

最后,从CVPixelBufferOpenGL纹理图像中获取一个OpenGL纹理名称:

_openGLTexture = CVOpenGLTextureGetName(_CVGLTexture);

对于iOS,从pixel buffer创建OpenGL ES纹理

首先从pixel buffer创建一个OpenGL ES Core Video纹理缓存:

cvret = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault,                 nil,                 _openGLContext,                 nil,                 &_CVGLTextureCache);

然后,从纹理缓存中创建一个CVPixelBuffer OpenGL ES纹理图像:

cvret = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,                 _CVGLTextureCache,                 _CVPixelBuffer,                 nil,                 GL_TEXTURE_2D,                 _formatInfo->glInternalFormat,                 _size.width, _size.height,                 _formatInfo->glFormat,                 _formatInfo->glType,                 0,                 &_CVGLTexture);

最后,从CVPixelBuffer OpenGL ES纹理图像中获取OpenGL ES纹理名称:

_openGLTexture = CVOpenGLESTextureGetName(_CVGLTexture);

从pixel buffer创建Metal纹理

首先实例化一个Metal纹理缓存,如下所示:

cvret = CVMetalTextureCacheCreate(                 kCFAllocatorDefault,                 nil,                 _metalDevice,                 nil,                 &_CVMTLTextureCache);

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 在视图中实现Metal和OpenGL交叉渲染求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们