如今,iOS支持名为'GL_EXT_color_buffer_half_float'的扩展,它可以让glRenderbufferStorage参数接受半浮点格式。
但是,在iOS中,renderbuffer应该连接到视图的CAEAGLLayer,如下所示:
- (BOOL) renderbufferStorage:(NSUInteger)target fromDrawable:(id)drawable
只能为一个帧缓冲区创建一个渲染缓冲区。所以,我认为我应该创建另一个帧缓冲区来附加一个新的渲染缓冲区,并为'half float'指定它的内部格式。我是对的吗?
另一个问题,glTexImage2D可以使用另一个扩展名'OES_texture_half_float',我们已经可以直接创建附加到framebuffer的半浮点纹理。似乎我们不需要渲染附加到framebuffer的半浮动渲染缓冲区。那么'GL_EXT_color_buffer_half_float'的使用场景是什么?
答案 0 :(得分:2)
Renderbuffers不必连接到CALayer。很多时候你需要进行某种类型的屏幕外渲染,并且在某些情况下使用半浮点输出类型会很有用。
Apple在WWDC 2011 OpenGL ES会议上展示了一个这样的例子,他们在iPad上展示了延迟照明.Kearwood Gilbert在a blog post here中描述了这种技术,尽管只有标准的8位 - 每个通道颜色深度。 Simon Yeung在his article here中展示了如何使用半浮点目标执行此操作。就个人而言,我已经将它用于机器视觉中的图像处理应用。例如,我最近在研究霍夫变换线检测器(based on the work of Dubská, et al.),其中一个步骤需要检测平行坐标空间中的局部最大值。使用标准的加法混合来累积Hough变换投票使我的RGBA颜色空间的8位颜色通道饱和,但是半浮动会给我更大的动态范围来挑选出真正的局部最大值。使用它可以大大降低此过程中的噪音(尽管iOS 6的新帧缓冲读取操作可以让我使用自定义混合来编码四个颜色通道中的更高动态范围值)。
渲染到半浮点输出确实会产生一些性能影响,但它可能是实现某些效果的唯一实用方法。