Opengl 什么是浮点纹理?

Opengl 什么是浮点纹理?,opengl,floating-point,textures,Opengl,Floating Point,Textures,我试着阅读OpenGL ARB_texture_float规范,但我仍然无法理解它 浮点数据如何与我正在加载到纹理中的图像中的普通8位每通道RGBA或RGB数据相关?FP纹理有一个特殊的指定内部格式范围(RGBA_16F、RGBA_32F等)。 常规纹理存储定点数据,因此从中读取会得到[0,1]范围值。相反,FP纹理的结果是提供[-inf,+inf]范围(不一定具有更高的精度) 在许多情况下(如HDR渲染),只需变换值以适应[0,1]范围,就可以轻松地在不使用FP纹理的情况下进行渲染。但也有一些

我试着阅读OpenGL ARB_texture_float规范,但我仍然无法理解它


浮点数据如何与我正在加载到纹理中的图像中的普通8位每通道RGBA或RGB数据相关?

FP纹理有一个特殊的指定内部格式范围(RGBA_16F、RGBA_32F等)。 常规纹理存储定点数据,因此从中读取会得到[0,1]范围值。相反,FP纹理的结果是提供[-inf,+inf]范围(不一定具有更高的精度)


在许多情况下(如HDR渲染),只需变换值以适应[0,1]范围,就可以轻松地在不使用FP纹理的情况下进行渲染。但也有一些情况,比如延迟渲染,您可能希望存储世界空间坐标,而不考虑其范围

基本上,浮点纹理是其中数据为浮点类型的纹理:) 也就是说,它没有夹紧。因此,如果纹理中有3.14f,则会在着色器中读取相同的值

您可以使用不同数量的频道创建它们。此外,您还可以根据格式装箱16位或32位纹理。e、 g

// create 32bit 4 component texture, each component has type float    
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, data);
数据可能是这样的:

float data[16][16];
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever
如果您使用的是16位格式,比如GL_RGBA16F,那么无论何时在着色器中读取,都将进行转换。因此,为了避免这种情况,您可以使用half4类型: half4值=纹理2d(My16Bitex,texcoord.xy)

因此,基本上,规格化8位和浮点纹理之间的区别在于,在第一种情况下,值将被带到[0..1]范围并被钳制,而在后一种情况下,值将按原样接收(1632转换除外,请参见上面的示例)

并不是说您可能希望将它们与FBO一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以附加为渲染目标。例如,不能附加亮度和强度格式

此外,并非所有硬件都支持浮点纹理的过滤,因此如果需要,您需要首先检查它


希望这能有所帮助。

它们对于向着色器获取数据(例如,isovalues)也很有用。那么,您将如何读取每个通道8位的普通RGB或RGBA图像,以及如何在内部解释这些值?e、 g.0-255或0-1范围内的值是否会在内部缩放到其他范围?@lokstok。glTexImage有一个名为“normalized”的参数。如果设置为“true”,您的输入字节将在[0,1]范围内转换。否则我想你会得到[0-255](我没有尝试过)。答案中的链接可以在这里找到:
uniform sampler2D myFloatTex;
float value = texture2D(myFloatTex, texcoord.xy);