【问题标题】:Why terrainData.heightmapTexture float value range is 0f-0.5f and not 0f-1f?为什么 terrainData.heightmapTexture 浮点值范围是 0f-0.5f 而不是 0f-1f?
【发布时间】:2019-05-04 12:24:55
【问题描述】:
在渲染到 terrainData.heightmapTexture 时,我发现将 1.0f 写入像素不会导致地形达到最大高度(如“地形高度”检查器字段中所指定),但 0.5 会(1.0 是其两倍,并且不适用于手动画笔编辑)。
看起来很奇怪/令人惊讶,但我希望这背后有合理的理由。 某人可以解释这种行为吗?
(图像显示了渲染正弦波(0.0-1.0 范围)后的地形。我使用的是计算着色器 > Graphics.CopyTexture > terrainData.DirtyHeightmapRegion 路径)
【问题讨论】:
标签:
c#
unity3d
compute-shader
unity3d-terrain
【解决方案1】:
Unity Technologies 工程师的回答:
高度图实现本身已签名,但被视为
渲染时无符号,所以我们只有一半的精度可用
用于高度值。这就是为什么我们所有的地形绘画
着色器将返回值限制在 0f 和 .5f 之间,这样我们就不会
最终将有符号值写入高度图中。如果你要放入
值大于 0.5,您会看到地形表面“包裹”到
负高度值。我不能说为什么这样做,但它可能
一直保持这种状态是因为需要对代码进行大量更改
使它们中的任何一个签名或未签名以匹配。
这些值是标准化的,以便我们可以获得尽可能高的精度
对于给定地形的最大高度,超出 0.5f。 0 是一个世界
0 和 0.5f 的高度偏移是 terrain.terrainData.size.y(最大
高度)
source