Image 任何图像文件格式都支持负浮动吗?

Image 任何图像文件格式都支持负浮动吗?,image,opengl,Image,Opengl,我正在使用OpenGL实现一些屏幕空间过滤器。出于调试的目的,我想保存一组纹理,以便可以比较单个像素值。问题是这些16位浮点纹理具有负值。你知道有支持负值的图像文件格式吗?如何导出它们?是的,有一些这样的格式。。。您需要的是使用非钳制浮动格式。这就是我正在使用的: GL_LUMINANCE32F_ARB glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE32F_ARB, size, size, 0, GL_LUMINANCE, GL_FLOAT, data);

我正在使用OpenGL实现一些屏幕空间过滤器。出于调试的目的,我想保存一组纹理,以便可以比较单个像素值。问题是这些16位浮点纹理具有负值。你知道有支持负值的图像文件格式吗?如何导出它们?

是的,有一些这样的格式。。。您需要的是使用非钳制浮动格式。这就是我正在使用的:

GL_LUMINANCE32F_ARB
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE32F_ARB, size, size, 0, GL_LUMINANCE, GL_FLOAT, data);
这里有一个例子:

在那里,我传递了一个浮动纹理中的几何体,该纹理没有被钳制,因此它具有完整的范围,而不仅仅是
,正如您可以看到的,负范围也包括在内

很少有其他的,但一旦我发现一个是没有意义的,寻找更多的他们

您可以使用

此外,IIRC还有一些函数可以设置OpenGL的夹紧行为,但从未使用过它(如果我的内存正常的话)

[Edit1]导出到文件

这是一个问题,除非你是出口到ASCII或数学矩阵文件,我不知道有任何格式支持负像素值

所以你需要解决这个问题。。。因此,只需将范围转换为非负范围,如下所示:

float max = ???; //some value that is safely bigger than biggest abs value in your images
for (each pixel x,y)
 {
 pixel(x,y) = 0.5*(max + pixel(x,y))
 }
然后在需要时转换回来

for (each pixel x,y)
 {
 pixel(x,y) = (2.0*pixel(x,y)-max);
 }
另一种常见的方法是将范围规格化为
,其优点是可以从RGB颜色推断3D方向。。。(与法线/凹凸贴图类似)

回来

pixel(x,y) = 2.0*max*pixel(x,y)-max; 

我已经在使用
GL\u RGBA16F
,它是否已经可以处理负值了?抱歉,如果我的问题让人困惑,我正在寻找图像格式,如in.jpg、.png、.hdr等,因为我想将图像保存到磁盘。我将编辑我的问题,使其更清楚。非常有趣的链接
pixel(x,y) = 2.0*max*pixel(x,y)-max;