GLInterop
GLInterop 是一个库,支持 GL 纹理、Metal 纹理和 CVPixelBufferRef 之间的可互操作渲染目标。
特性
渲染目标
GLInterop 提供多种渲染目标,以满足大多数业务需求。
RenderTarget | GL Texture | GL 框架缓冲区 | Metal Texture | CVPixelBufferRef |
---|---|---|---|---|
GLIRenderTarget | o | x | x | o |
GLIMetalRenderTarget | o | x | o | o |
GLIFramebufferTextureRenderTarget | o | o | x | x |
GLITextureRenderTarget | o | x | x | x |
GLIRenderer
GLIRenderer 是 GL 程序的轻量级封装,提供调用 GL 程序的基本能力。
GLIRenderer 提供一个 inputTextures
数组,一个支持多种渲染目标类型的 output
,用于清除帧缓冲区的 clearColor
,以及执行实际渲染操作的 render
方法。
对于视图端口设置,GLIRenderer 提供以下方法
- (void)setViewPortWithContentMode:(UIViewContentMode)contentMode inputSize:(CGSize)inputSize;
对于顶点属性,GLIRenderer 提供以下方法
- (void)setVertexAttributeToBuffer:(NSString *)attribName bytes:(void *)bytes size:(size_t)size;
- (void)applyVertexAttributes;
为了统一,以下方法将存储统一值,并在执行applyUniforms
方法之前不会传递给GL。
- (void)setUniform:(NSString *)uniformName bytes:(void *)bytes;
- (void)setTexture:(NSString *)textureName texture:(GLuint)glTexture;
这使您可以在实际渲染开始之前为您的GL程序做一些准备,例如参数默认设置,或一些内置的静态图像纹理设置。
如果您重写了render
方法,那么您需要调用此方法将统一和其他纹理传递给GL着色器
- (void)applyUniforms;
事实上,如果GLIRenderer仅提供这些方法,它仍会使您觉得使用不方便。例如,inputTextures
将假设着色器中的纹理名为"inputTexture + Number",这会降低着色器的可读性。此外,inputTextures
是一个数组,这意味着您必须一次性收集所有渲染所需的纹理,即使下一次渲染只有一个纹理发生变化。
现在,这个版本提供了一个新的方法,您只需要在GLIRenderer的子类中定义以uniform_
开头的属性,就可以获取/设置纹理/浮点/整型的统一值。
@property (nonatomic, strong) id <GLITexture> uniform_blurTexture;
@property (nonatomic) float uniform_intensity;
@property (nonatomic) int uniform_stride;
此代码表示,要设置着色器中的blueTexture
、intensity
和stride
,您只需要定义它,而不需要编写这些实现。实际上,GLIRenderer将在运行时生成这些统一的getter/setter。
这个框架中有多种渲染器
GLIBaseShapeRenderer
GLIBaseShapeRenderer用于渲染GL基元,如纹理四边形、点、线和三角带。
GLIViewRenderer
GLIViewRenderer用于将GL纹理渲染到一个符合GLIRenderableSurface
协议的可渲染表面(例如。GLIView)。
GLITransform
GLITransform可以对其输入纹理应用转换,并以指定的大小渲染到输出。它可以用于调整大小、裁剪、翻转内容等。
Utils
- GLIContext
- GLITextureCache
- GLIMetalTextureCache
- GLIPixelBufferPool
- GLITexture
- GLISyncObject
GLIView
GLIView 是一个纯视图,符合 GLIRenderableSurface 协议以便成为可渲染的表面。其实现中不包含 GL API 调用,可以避免上下文管理问题。
示例
要运行示例项目,请克隆仓库,然后首先从 Example 目录中运行 pod install
。
需求
iOS 8.0 或更高版本。
安装
GLInterop 通过 CocoaPods 提供。要安装它,只需在 Podfile 中添加以下行
pod 'GLInterop'
作者
许可协议
GLInterop 在 MIT 许可协议下提供。有关更多信息,请查看 LICENSE 文件。