我正在为 iPhone (iOS 4.1) 编写一个 OpenGL ES 2.0 应用程序。在着色器中完成的计算结束时,我需要将一些数据写回 CPU。据我所知,这可以通过 glReadPixels() 来完成。为了保持精度,我想在着色器之间使用 half_float 或 float 纹理,这似乎受到扩展的支持。
问题:是否可以使用 glReadPixels() 读取 float 或 half_float 纹理?
谢谢,
拉斯
我正在为 iPhone (iOS 4.1) 编写一个 OpenGL ES 2.0 应用程序。在着色器中完成的计算结束时,我需要将一些数据写回 CPU。据我所知,这可以通过 glReadPixels() 来完成。为了保持精度,我想在着色器之间使用 half_float 或 float 纹理,这似乎受到扩展的支持。
问题:是否可以使用 glReadPixels() 读取 float 或 half_float 纹理?
谢谢,
拉斯
我也遇到过这个问题。对于 iOS,您可以使用 GL_EXTENSIONS 参数检查可用的扩展列表 - GL_OES_texture_float 必须存在。但!根据规范,这不会提供从 GPU 读取浮点值的机会。这是来自 glReadPixels() 文档:
只接受两个格式/类型参数对。GL_RGBA/GL_UNSIGNED_BYTE 总是被接受的,另一个可接受的对可以通过查询 GL_IMPLEMENTATION_COLOR_READ_FORMAT 和 GL_IMPLEMENTATION_COLOR_READ_TYPE 来发现。
因此,您可以使用以下代码检查可用的类型/格式:
GLint ext_format, ext_type;
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &ext_format);
glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &ext_type);