Урок 6.3: Процедурная генерация
Шум Перлина
Шум Перлина используется для генерации естественно выглядящих текстур и паттернов.
// Упрощенная версия шума Перлина
private float Noise(int x, int y)
{
int n = x + y * 57;
n = (n << 13) ^ n;
return (1.0f - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f);
}
private float SmoothNoise(float x, float y)
{
int intX = (int)x;
int intY = (int)y;
float fracX = x - intX;
float fracY = y - intY;
float v1 = Noise(intX, intY);
float v2 = Noise(intX + 1, intY);
float v3 = Noise(intX, intY + 1);
float v4 = Noise(intX + 1, intY + 1);
float i1 = Interpolate(v1, v2, fracX);
float i2 = Interpolate(v3, v4, fracX);
return Interpolate(i1, i2, fracY);
}
private float Interpolate(float a, float b, float t)
{
return a + (b - a) * t * t * (3 - 2 * t);
}Генерация текстур
private Bitmap GenerateTexture(int width, int height)
{
Bitmap texture = new Bitmap(width, height);
float scale = 0.1f;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
float noise = SmoothNoise(x * scale, y * scale);
int gray = (int)((noise + 1) * 127.5f);
texture.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
}
}
return texture;
}Случайные узоры
private void GeneratePattern(Graphics g, int width, int height)
{
Random rnd = new Random();
for (int i = 0; i < 1000; i++)
{
int x = rnd.Next(width);
int y = rnd.Next(height);
int size = rnd.Next(5, 20);
Color color = Color.FromArgb(
rnd.Next(256), rnd.Next(256), rnd.Next(256));
using (SolidBrush brush = new SolidBrush(color))
{
g.FillEllipse(brush, x, y, size, size);
}
}
}Практика: генератор фонов
Создайте генератор фонов, который создает:
- Градиентные фоны
- Текстуры на основе шума
- Абстрактные узоры
- Возможность сохранения
Практическое задание
Задание: Процедурная генерация
- Реализуйте генератор текстур используя шум Перлина
- Создайте различные типы текстур (дерево, камень, облака)
- Добавьте возможность сохранения сгенерированных текстур
Проверка знаний
Ответьте на вопросы, чтобы проверить, насколько хорошо вы усвоили материал:
1. Усвоили ли вы основные концепции урока?
2. Готовы ли вы применить изученное на практике?
3. Что такое шум Перлина?