我一直在使用Libnoise的dotnet端口使用以下代码在XNA中生成一些高亮图:
ImprovedPerlin perlin = new ImprovedPerlin(seed, NoiseQuality.Standard);
FilterModule module = new SumFractal();
module.Frequency = 0.2f;
module.OctaveCount = 6;
module.Lacunarity = 2;
module.Gain = 2;
module.Offset = 1;
module.SpectralExponent = 0.9f;
module.Primitive3D = perlin;
float bound = 10f;
NoiseMapBuilderPlane builder = new NoiseMapBuilderPlane(
6.0f + mapX, 10.0f + mapX, 1.0f + mapZ, 5.0f + mapZ, true);
//bound + mapx, (bound + mapX) * 2, bound, bound * 2, true);
NoiseMap noiseMap = new NoiseMap(128, 128);
builder.SetSize(128, 128);
builder.SourceModule = module;
builder.NoiseMap = noiseMap;
builder.Build();
Graphics.Tools.Noise.Renderer.GradientColor gradient =
Graphics.Tools.Noise.Renderer.GradientColor.GRAYSCALE;
Color[] colorData = new Color[128 * 128];
texture =
new Texture2D(AssetManager.graphicsDeviceManager.GraphicsDevice, 128, 128);
for (int y = 0; y < 128; ++y)
{
for (int x = 0; x < 128; ++x)
{
byte color = gradient.GetColor(noiseMap.GetValue(x, y)).Green;
}
}
texture.SetData<Color>(colorData);
这一切都运行正常,即使我在提供的不使用XNA的libnoise示例中得到不同的结果(由于某些原因,我需要降低频率以在XNA中获得相同的结果)。
可悲的是,没有NoiseBuilder [3D]来生成3D变体的噪音,所以我必须使用perlin函数自己构建它。但即使尝试使用perlin.getValue()生成2D噪声似乎也会出错;
float px = 0;
float py = 0;
for (int y = 0; y < 128; ++y)
{
py += 0.1f;
for (int x = 0; x < 128; ++x)
{
px += 0.1f;
int color = (int)((perlin.GetValue(px, py, 0) + 1) * 177.5f);
}
}
texture.SetData < Color > (colorData);
我不知道如何合并SumFractal,但我想这是后来的担心。