Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Новый 2D StarField: реализация звездного неба в Delphi и Pascal.

Delphi , Графика и Игры , Canvas

 

В этой статье мы рассмотрим создание эффекта звездного неба (StarField) на Object Pascal (Delphi), вдохновленный классическими демками Amiga. Мы проследим эволюцию от простой 2D реализации до более сложной 3D версии с использованием библиотеки BGRA и даже попробуем применить шейдеры. Также будут рассмотрены варианты создания компонентов для упрощения разработки.

1. Простой 2D StarField

Первый пример демонстрирует базовую реализацию 2D звездного неба. Каждая звезда представлена как запись с координатами X, Y, скоростью и цветом. Звезды перемещаются по экрану, и когда достигают края, переносятся на противоположную сторону.

type
  TStar = record
    X, Y: Single;
    Speed: Single;
    Color: TBGRAPixel;
  end;

procedure TForm1.UpdateStars;
var
  i: Integer;
begin
  for i := 0 to Length(FStars) - 1 do
  begin
    FStars[i].Y := FStars[i].Y + FStars[i].Speed * SpeedMultiplier;
    if FStars[i].Y > BGRAVirtualScreen.Height then
    begin
      FStars[i].Y := 0;
      FStars[i].X := Random(BGRAVirtualScreen.Width);
    end;
  end;
  BGRAVirtualScreen.RedrawBitmap;
end;

procedure TForm1.BGRAVirtualScreenRedraw(Sender: TObject; Bitmap: TBGRABitmap);
var
  i: Integer;
begin
  for i := 0 to Length(FStars) - 1 do
  begin
    Bitmap.FillRect(
      Round(FStars[i].X),
      Round(FStars[i].Y),
      Round(FStars[i].X) + 2,
      Round(FStars[i].Y) + 2,
      FStars[i].Color
    );
  end;
end;

Этот код использует BGRAVirtualScreen для отрисовки звезд. UpdateStars обновляет положение звезд, а BGRAVirtualScreenRedraw рисует их на экране.

2. 3D StarField

Следующий шаг - добавление третьего измерения. Теперь каждая звезда имеет координаты X, Y, Z. Для имитации перспективы используется проекция 3D координат на 2D экран. Также добавлена возможность вращения звездного неба.

type
  TStar = record
    X, Y, Z: Single;
    Speed: Double;
    Color: TBGRAPixel;
  end;

function TForm1.Project3Dto2D(X, Y, Z: Double; out ScX, ScY: Integer; out Size: Integer): Boolean;
var
  Scale: Single;
begin
  Result := False;
  if Z <= 0 then Exit;
  Scale := FocusZ / Z;
  ScX := CenterX + Round(X * Scale);
  ScY := CenterY + Round(Y * Scale);
  Size := Max(1, Round(4 * (1 - Z / MaxZ)));
  Result := (ScX >= 0) and (ScX < BGRAVirtualScreen.Width) and
            (ScY >= 0) and (ScY < BGRAVirtualScreen.Height);
end;

Функция Project3Dto2D выполняет проекцию 3D координат на 2D. Она вычисляет масштаб (Scale) на основе Z-координаты и FocusZ, а затем использует этот масштаб для вычисления экранных координат ScX и ScY. Также вычисляется размер звезды Size, который уменьшается с увеличением Z-координаты.

Альтернативное решение для 3D:

Вместо использования собственной функции проекции, можно использовать OpenGL или DirectX для более реалистичной 3D графики. Это потребует больше кода, но позволит добиться более впечатляющих результатов.

3. StarField с использованием Blitter Object BOB

В этом примере звезды заменены спрайтами (Blitter Object BOB), что позволяет использовать более сложные формы и текстуры для звезд. Используется несколько слоев спрайтов с разной скоростью для создания эффекта глубины.

procedure TForm1.BGRAVirtualScreenRedraw(Sender: TObject; Bitmap: TBGRABitmap);
var
  i, Pidx: Integer;   // bob plane index
begin
  for i := 0 to Length(FStars) - 1 do
  begin
    Pidx := FStars[i].Plane;
    Bitmap.PutImage(Trunc(FStars[i].X), Trunc(FStars[i].Y), bob1Scale[Pidx], dmLinearBlend);
  end;
 end;

Здесь bob1Scale - массив масштабированных спрайтов. Bitmap.PutImage используется для отрисовки спрайта на экране с использованием режима смешивания dmLinearBlend.

Альтернативное решение:

Вместо использования TBGRABitmap.PutImage можно использовать более производительные методы отрисовки спрайтов, такие как Direct2D или OpenGL.

4. Создание компонента T2DStarfield

Для упрощения использования эффекта звездного неба, можно создать собственный компонент T2DStarfield. Компонент инкапсулирует всю логику отрисовки звездного неба и предоставляет свойства для настройки параметров, таких как количество звезд, скорость, цвет и т.д.

Создание компонента позволяет повторно использовать код и упрощает разработку.

5. Использование шейдеров

Шейдеры позволяют создавать сложные визуальные эффекты, используя GPU. В примере, приведенном в статье, используется BGRA GL пакет для применения пиксельных шейдеров к звездному небу.

procedure TForm1.ShaderScreen1Redraw(Sender: TObject; BGLContext: TBGLContext);
begin
   if gl_surface <> nil then
     BGLContext.Canvas.StretchPutImage(0, 0, ShaderScreen1.Width, ShaderScreen1.Height, gl_surface);
   if shader3 <> nil then
  begin
    BGLContext.Canvas.Lighting.ActiveShader := shader3;
  end;
end;

Здесь shader3 - объект TBGLShader3D, который содержит скомпилированный пиксельный шейдер. BGLContext.Canvas.Lighting.ActiveShader устанавливает этот шейдер для отрисовки.

Альтернативное решение:

Вместо BGRA GL можно использовать другие библиотеки для работы с OpenGL, такие как GLEW или GLScene.

6. Оптимизация производительности

Для достижения высокой производительности при отрисовке большого количества звезд (например, 50,000), необходимо использовать оптимизированные методы отрисовки. В одном из примеров используется Windows API для прямого доступа к буферу экрана.

Вывод

В этой статье мы рассмотрели различные подходы к созданию эффекта звездного неба на Object Pascal (Delphi). Мы начали с простой 2D реализации и постепенно усложняли ее, добавляя 3D перспективу, спрайты и шейдеры. Также были рассмотрены варианты создания компонентов для упрощения разработки и оптимизации производительности. Эти примеры демонстрируют возможности языка Object Pascal и библиотеки BGRA для создания впечатляющих визуальных эффектов.

Создано по материалам из источника по ссылке.

В статье рассматриваются различные подходы к реализации эффекта звездного неба на Delphi и Pascal, начиная с простой 2D-версии и заканчивая использованием 3D, спрайтов, шейдеров и оптимизации производительности.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Canvas ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-09-07 18:59:00/0.0040600299835205/0