从高度图文件采样生成的地形为何呈现块状效果?
问题分析与解决方案
你的问题核心出在高度图采样方式上,虽然调试时看到灰度值是0.0-1.0的平滑区间,但实际采样逻辑有两个关键问题:
- 采样坐标匹配错误:你计算了
noiseX和noiseY但根本没用到,直接用地形高度图的整数坐标x/y去取纹理像素。如果地形高度图分辨率(比如1025)和你的高度图纹理宽高不一致,会导致大量重复采样同一个像素,自然出现块状。 - 无插值采样:
GetPixel()是取整数坐标的原始像素,没有任何平滑插值,哪怕坐标对应,相邻像素的灰度突变也会被直接放大成地形的块状凸起。
修复后的代码
直接修改CalculateTextureHeight方法,用双线性插值采样来平滑过渡灰度值,同时正确映射坐标:
private float CalculateTextureHeight(int x, int y, int heightmapRes) { // 计算归一化的UV坐标(0-1范围),适配任意尺寸的高度图纹理 float uvX = (float)x / (heightmapRes - 1); float uvY = (float)y / (heightmapRes - 1); // 使用GetPixelBilinear进行双线性插值采样,得到平滑的灰度值 return _heightmap.GetPixelBilinear(uvX, uvY).grayscale; }
额外注意事项
- 纹理导入设置:在Unity Inspector中把高度图纹理的纹理类型设为
Texture,过滤模式设为双线性或三线性,压缩格式选无压缩或高质量,避免压缩导致灰度值失真。 - 分辨率匹配:如果追求最精准的效果,尽量让高度图纹理的宽高和地形的
heightmapResolution一致(地形高度图分辨率一般是2的n次方+1,比如513、1025)。
内容的提问来源于stack exchange,提问作者akaBase
相关产品推荐
相关产品推荐

