这更多是一个理论问题。我想知道将浮点值写入WebGL 1.0中类型为gl.UNSIGNED_BYTE的空RGBA纹理中时会发生什么。显然,每个通道都有8位。但这还不足以表示浮点值,对吗?尽管如此,它或多或少都以某种方式起作用。在此处查看片段着色器代码的一部分:

precision highp float;

uniform vec2 u_Resolution;

void main(void){
   gl_FragColor = vec4(gl_FragCoord.xy / u_Resolution, 0.0, 1.0);
}


当我将纹理指定为gl.FLOAT类型(使用OES_texture_float扩展名)时,结果当然更好。但是我想确切地知道为什么要这样做。

此外:指定的精度是否会影响要写入的纹理?

#1 楼

图形API中的无符号字节纹理通常被“规范化”-字节值解释为0.0到1.0,其中255的字节映射到1.0。所以不,它们不是真正的浮点值,但是当您读取/写入纹理时,硬件会自动将它们转换为浮点值。如果尝试写入[0,1]范围之外的值,它将被钳位。

对于precision highp零件,它不会直接影响纹理,但可以肯定会影响任何写入纹理的值的计算。例如,要计算8位纹理,您肯定需要至少8位的尾数精度(即lowp),并且您可能想要更多,这取决于您要执行的计算。我建议您检查设备上的实际精度水平,因为它们的精度取决于所拥有的GPU。有关更多信息,请参见此问题。

评论


$ \ begingroup $
那么,当写入纹理时,WebGL在内部执行诸如floor(x * 255)之类的操作来将[0,1]浮点值x映射到[0,255]吗?然后,当再次从该纹理读取时,x可能会偏离原始值。那是对的吗?并且在gl.FLOAT纹理的情况下,没有映射到[0,255]吗?
$ \ endgroup $
–阿联酋
17年7月28日在20:14

$ \ begingroup $
@Muad它将是圆形(x * 255)而不是地板,但是可以。是的,当您读回它时,由于四舍五入,您可能会得到略有不同的值。在浮动纹理中,它仅存储和检索您写入的确切值,没有重新映射(也没有钳制到[0,1])。
$ \ endgroup $
–内森·里德(Nathan Reed)
17年7月28日在22:08