Perlin Noise 是一種梯度噪聲算法,由 Ken Perlin 於 1983 年發明,廣泛用於程序化紋理生成(雲霧、地形、大理石紋理等)。其核心思想:在整數格點生成隨機梯度向量,通過插值平滑過渡,產生自然、連續的偽隨機圖案。
cv::randn 生成高斯分布的基礎噪聲圖。
// 核心參數
float persistence = 0.8f; // 振幅衰減因子
int octaveCount = 8; // 八度數(層數)
// 餘弦插值函數
float Cosine_Interpolate(float x1, float x2, float alpha) {
float ft = alpha * CV_PI;
float f = (1 - cos(ft)) * 0.5f;
return x1 * (1 - f) + x2 * f;
}
// 生成平滑噪聲(雙線性插值)
void Generate_smoothnoise(Mat& src, Mat& dst, int octave) {
int samplePeriod = 1 << octave; // 2^octave
float sampleFrequency = 1.0f / samplePeriod;
for (int i = 0; i < src.rows; ++i) {
for (int j = 0; j < src.cols; ++j) {
// 計算四個角點索引與插值權重
// ... 雙線性插值邏輯 ...
// 使用 Cosine_Interpolate 進行水平、垂直兩次插值
}
}
}
// 主循環疊加八度
for (int o = 0; o < octaveCount; ++o) {
Generate_smoothnoise(Base_Noise, Cloud_Temp, o);
float amplitude = pow(persistence, octaveCount - o);
Cloud += Cloud_Temp * amplitude;
totalAmplitude += amplitude;
}
Cloud /= totalAmplitude; // 歸一化


persistence 控制細節豐富度:值越大,高頻細節保留越多。octaveCount 決定細節層級:地形生成常用 6-10,實時渲染可降低至 3-4。