版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.10.11 星期四 |
前言
很多做视频和图像的,相信对这个框架都不是很陌生,它渲染高级3D图形,并使用GPU执行数据并行计算。接下来的几篇我们就详细的解析这个框架。感兴趣的看下面几篇文章。
1. Metal框架详细解析(一)—— 基本概览
2. Metal框架详细解析(二) —— 器件和命令(一)
3. Metal框架详细解析(三) —— 渲染简单的2D三角形(一)
4. Metal框架详细解析(四) —— 关于GPU Family 4(一)
5. Metal框架详细解析(五) —— 关于GPU Family 4之关于Imageblocks(二)
6. Metal框架详细解析(六) —— 关于GPU Family 4之关于Tile Shading(三)
7. Metal框架详细解析(七) —— 关于GPU Family 4之关于光栅顺序组(四)
8. Metal框架详细解析(八) —— 关于GPU Family 4之关于增强的MSAA和Imageblock采样覆盖控制(五)
9. Metal框架详细解析(九) —— 关于GPU Family 4之关于线程组共享(六)
10. Metal框架详细解析(十) —— 基本组件(一)
11. Metal框架详细解析(十一) —— 基本组件之器件选择 - 图形渲染的器件选择(二)
12. Metal框架详细解析(十二) —— 基本组件之器件选择 - 计算处理的设备选择(三)
13. Metal框架详细解析(十三) —— 计算处理(一)
14. Metal框架详细解析(十四) —— 计算处理之你好,计算(二)
15. Metal框架详细解析(十五) —— 计算处理之关于线程和线程组(三)
16. Metal框架详细解析(十六) —— 计算处理之计算线程组和网格大小(四)
17. Metal框架详细解析(十七) —— 工具、分析和调试(一)
18. Metal框架详细解析(十八) —— 工具、分析和调试之Metal GPU Capture(二)
19. Metal框架详细解析(十九) —— 工具、分析和调试之GPU活动监视器(三)
20. Metal框架详细解析(二十) —— 工具、分析和调试之关于Metal着色语言文件名扩展名、使用Metal的命令行工具构建库和标记Metal对象和命令(四)
21. Metal框架详细解析(二十一) —— 基本课程之基本缓冲区(一)
22. Metal框架详细解析(二十二) —— 基本课程之基本纹理(二)
23. Metal框架详细解析(二十三) —— 基本课程之CPU和GPU同步(三)
24. Metal框架详细解析(二十四) —— 基本课程之参数缓冲 - 基本参数缓冲(四)
25. Metal框架详细解析(二十五) —— 基本课程之参数缓冲 - 带有数组和资源堆的参数缓冲区(五)
26. Metal框架详细解析(二十六) —— 基本课程之参数缓冲 - 具有GPU编码的参数缓冲区(六)
27. Metal框架详细解析(二十七) —— 高级技术之图层选择的反射(一)
28. Metal框架详细解析(二十八) —— 高级技术之使用专用函数的LOD(一)
29. Metal框架详细解析(二十九) —— 高级技术之具有参数缓冲区的动态地形(一)
30. Metal框架详细解析(三十) —— 延迟照明(一)
Mixing Metal and OpenGL Rendering in a View - 在视图中混合Metal和OpenGL渲染
使用可互操作的纹理在同一视图中使用Metal和OpenGL绘图。
如果您正在开发一个新的应用程序并将传统的OpenGL
代码迁移到Metal
,那么可互操作的纹理使您可以轻松地实时查看结果。
您可以通过初始化作为可互操作纹理操作的CVPixelBuffer,将Metal或OpenGL内容渲染到任一视图中。 当您启用像素缓冲区的Metal和OpenGL兼容性标记时,纹理可以被绘制到 - 并由它俩任一渲染技术呈现。
如果您正在处理已经部署的应用程序,则可互操作的纹理可让您选择在整个移植过程中逐步释放更新。
Select a Compatible Pixel Format - 选择兼容的像素格式
要创建可互操作的纹理,请选择彼此兼容的Core Video
像素格式,Metal像素格式和OpenGL内部格式。 此示例为您提供了一个预先加载了兼容选项的表,并根据所需的Metal像素格式选择一个:
for(int i = 0; i < AAPLNumInteropFormats; i++) {
if(pixelFormat == AAPLInteropFormatTable[i].mtlFormat) {
return &AAPLInteropFormatTable[i];
}
}
Create an Interoperable Texture - 创建可互操作的纹理
使用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);
For macOS, Create an OpenGL Texture from the Pixel Buffer - 对于macOS,从像素缓冲区创建OpenGL纹理
首先从像素缓冲区创建OpenGL Core Video
纹理缓存:
cvret = CVOpenGLTextureCacheCreate(
kCFAllocatorDefault,
nil,
_openGLContext.CGLContextObj,
_CGLPixelFormat,
nil,
&_CVGLTextureCache);
然后,从纹理缓存创建一个支持CVPixelBuffer
的OpenGL纹理图像:
cvret = CVOpenGLTextureCacheCreateTextureFromImage(
kCFAllocatorDefault,
_CVGLTextureCache,
_CVPixelBuffer,
nil,
&_CVGLTexture);
最后,从CVPixelBuffer
支持的OpenGL
纹理图像中获取OpenGL纹理名称:
_openGLTexture = CVOpenGLTextureGetName(_CVGLTexture);
For iOS, Create an OpenGL ES Texture from the Pixel Buffer - 对于iOS,从像素缓冲区创建OpenGL ES纹理
首先从像素缓冲区创建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);
Create a Metal Texture from the Pixel Buffer - 从像素缓冲区创建Metal纹理
首先实例化Metal纹理缓存,如下所示:
cvret = CVMetalTextureCacheCreate(
kCFAllocatorDefault,
nil,
_metalDevice,
nil,
&_CVMTLTextureCache);
然后,从纹理缓存中创建一个支持CVPixelBuffer
的Metal纹理图像:
cvret = CVMetalTextureCacheCreateTextureFromImage(
kCFAllocatorDefault,
_CVMTLTextureCache,
_CVPixelBuffer, nil,
_formatInfo->mtlFormat,
_size.width, _size.height,
0,
&_CVMTLTexture);
最后,使用Core Video
Metal纹理参考获取Metal纹理:
_metalTexture = CVMetalTextureGetTexture(_CVMTLTexture);
In an OpenGL View, Draw Metal Content - 在OpenGL视图中,绘制Metal内容
在移植应用程序时,逐语句,首先使用Metal渲染到OpenGL可以绘制的可互操作的像素缓冲区。 下列中的每个项目描述了下图中对应的编号区域:
- 1) Metal通过应用绿色来清除可互操作的纹理。
- 2) Metal将带有白色文本和颜色样本的四边形渲染到可互操作的纹理上。
- 3) OpenGL通过应用红色来清除背景。
- 4) OpenGL呈现带有黑色文本和可互操作纹理的四边形。
In a Metal View, Draw OpenGL Content - 在Metal View中,绘制OpenGL内容
当您准备好使用Metal时,将OpenGL内容绘制到Metal视图中,但是要使用一些您打算逐步移植的旧OpenGL代码。 下列中的每个项目描述了下图中对应的编号区域:
- 1) OpenGL通过应用红色来清除可互操作的纹理。
- 2) OpenGL将带有白色文本和颜色样本的四边形渲染到可互操作的纹理上。
- 3) Metal通过应用绿色来清除背景。
- 4) Metal使用黑色文本和可互操作的纹理呈现四边形。
后记
本篇主要讲述了在视图中混合Metal和OpenGL渲染,感兴趣的给个赞或者关注~~~