我试图将我的头部包裹在浮点纹理周围,但我发现很难找到任何可以向我解释它们的好资源..我试过阅读OpenGL ARB_texture_float规范,但我仍然无法理解它..
浮点数据如何与我正在加载到纹理中的图像中的每个通道的正常8位RGBA或RGB数据相关?
感谢您提供帮助以及与我的问题相关的任何信息!!
答案 0 :(得分:15)
以下是关于它的一点点here。
基本上浮点纹理是一种纹理,其中数据是浮点类型:) 那就是它没有被钳制。因此,如果纹理中有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
然后在着色器中你可以得到完全相同的(如果你使用FLOAT32纹理)值。
e.g。
uniform sampler2D myFloatTex;
float value = texture2D(myFloatTex, texcoord.xy);
如果你使用16位格式,比如说GL_RGBA16F,那么每当你在着色器中阅读时,你都会有一个转换。所以,为了避免这种情况,你可以使用half4类型: half4 value = texture2D(my16BitTex,texcoord.xy);
因此,基本上,归一化的8位和浮点纹理之间的区别在于,在第一种情况下,您的值将被带到[0..1]范围并被钳制,而在后者中,您将按原样接收您的值(除了对于16&lt; - &gt; 32转换,请参阅上面的示例。)
并不是说您可能希望将它们与FBO一起用作渲染目标,在这种情况下,您需要知道并非所有格式都可以作为渲染目标附加。例如。你不能附上亮度和强度格式。
此外,并非所有硬件都支持浮点纹理的过滤,因此如果需要,您需要首先检查它。
希望这有帮助。
答案 1 :(得分:3)
FP纹理具有特殊指定范围的内部格式(RGBA_16F,RGBA_32F等)。 常规纹理存储定点数据,因此从它们读取会给出[0,1]范围值。相反,FP纹理会给你[-inf,+ inf]范围(不一定具有更高的精度)。
在许多情况下(如HDR渲染),您可以轻松地在没有FP纹理的情况下继续进行,只需将值转换为适合[0,1]范围即可。但是,如果您想要存储世界空间坐标而不关心它们的范围,则会出现像延迟渲染这样的情况。