1

现在,iOS 支持一个名为 'GL_EXT_color_buffer_half_float' 的扩展,它可以让 glRenderbufferStorage 的参数接受半浮点格式。

但是,在 iOS 中,渲染缓冲区应该像这样连接到视图的 CAEAGLLayer:

- (BOOL) renderbufferStorage:(NSUInteger)target fromDrawable:(id)drawable

一个framebuffer只能创建一个renderbuffer。所以,我想我应该创建另一个帧缓冲区来附加一个新的渲染缓冲区,并将它的内部格式指定为“半浮点”。我对吗?

另一个问题,glTexImage2D 可以使用另一个扩展“OES_texture_half_float”,我们已经可以直接创建附加到帧缓冲区的半浮点纹理。似乎我们不需要渲染附加到帧缓冲区的半浮点渲染缓冲区。那么'GL_EXT_color_buffer_half_float'的使用场景是什么?

4

1 回答 1

2

渲染缓冲区不必连接到 CALayer。很多时候您需要进行某种形式的离屏渲染,在某些情况下,使用半浮点输出类型可能很有用。

Apple 在 WWDC 2011 OpenGL ES 会议上展示了一个这样的示例,他们展示了在 iPad 2 上工作的延迟照明。Kearwood Gilbert 在此处的博客文章中描述了这种技术,尽管只有标准的每通道 8 位颜色深度。Simon Yeung 在他的文章中展示了如何使用半浮动目标来做到这一点。

就个人而言,我将它用于机器视觉中的图像处理应用程序。例如,我最近正在研究 Hough 变换线检测器(基于 Dubská 等人的工作),其中一个步骤需要检测平行坐标空间中的局部最大值。使用标准加法混合来累积霍夫变换投票会使我的 RGBA 颜色空间的 8 位颜色通道饱和,但是半浮点数会给我更多的动态范围来挑选真正的局部最大值。使用它可以大大降低此过程中的噪音(尽管 iOS 6 的新帧缓冲区读取操作可能让我使用自定义混合来编码四个颜色通道中更高动态范围的值)。

渲染到半浮点输出确实会产生一些性能后果,但它可能是实现某些效果的唯一实用方法。

于 2013-04-28T19:49:35.053 回答