提问人:simd 提问时间:9/30/2023 最后编辑:simd 更新时间:9/30/2023 访问量:50
在金属中从“r16Snorm”纹理到“一半”变量的精度损失读数
Precision loss reading from `r16Snorm` texture to `half` variable in Metal
问:
我的假设是否正确,即将一个值从纹理读取到金属着色语言数据类型中总是不可避免地导致精度损失?从一开始就对我来说并不明显,因为它们都是 16 位格式。但我想可以在其区间 [-1, 1] 中存储更精确的值,但代价是删除此区间之外的任何值。基本上,如果我理解正确,格式没有任何指数位,并且将所有 16 位仅用于有效和符号,那么与 ..r16SNorm
half
.r16SNorm
UNorm
SNorm
half
这是否意味着从其他任何东西中读取几乎都没有意义?或者也许有一种方法可以以某种方式“重新规范化”?r16SNorm
float
// texture is in .r16SNorm pixel format
texture2d<half, access::sample> texture [[texture(0)]]
...
// float is fine
float value = texture.sample(sampler, pixel).x;
// half is never enough to store normalized 16-bit???
half value = texture.sample(sampler, pixel).x;
答: 暂无答案
评论
half
SNorm
sample
texture2d<float, ...>
texture2d<half, ...>