首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

DelphiX 實戰:TDIB.InitLight 與 DrawLights 動態光照效果

     編輯:Delphi

TDIB.InitLight 與 DrawLights 結合實現 2D 動態點光源效果,支援多光源、光暈大小、顏色與衰減控制。本文提供滑鼠追蹤單一光源的即時互動範例。

效果預覽

動態光照效果

核心程式碼

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DIB, StdCtrls;
type
  TForm1 = class(TForm)
    DXPaintBox1: TDXPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure DXPaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  end;
var Form1: TForm1;
implementation {$R *.dfm}
var dib: TDIB;

procedure TForm1.DXPaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var a: TLightArray;
begin
  DXPaintBox1.DIB.Assign(dib); // 重置基礎圖
  SetLength(a, 1); // 單一光源陣列
  a[0].X := X; a[0].Y := Y; // 光源位置跟隨滑鼠
  a[0].Size1 := 4; a[0].Size2 := 4; // 內/外半徑
  a[0].Color := clWhite; // 光源顏色
  DXPaintBox1.DIB.InitLight(1, 1); // 初始化光照引擎
  DXPaintBox1.DIB.DrawLights(a, clBlack); // 繪製光照(環境光黑)
  DXPaintBox1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
const ImgPath1 = 'C:\Temp\DX.jpg';
begin
  dib := TDIB.Create;
  dib.LoadFromFile(ImgPath1);
  DXPaintBox1.DIB.Assign(dib);
  DXPaintBox1.Width := dib.Width;
  DXPaintBox1.Height := dib.Height;
  DXPaintBox1.Repaint;
end;

procedure TForm1.FormDestroy(Sender: TObject); begin dib.Free; end;
end.

光源結構 TLightArray 元素

欄位類型說明
X, YInteger光源中心座標
Size1Integer核心半徑(全亮區域)
Size2Integer外緣半徑(衰減到 0 區域)
ColorTColor光源顏色(RGB 分量獨立計算)

關鍵方法

  • InitLight(AmbientR, AmbientG, AmbientB) 或 InitLight(AmbientColor, Intensity):初始化環境光與強度
  • DrawLights(LightArray, AmbientColor):根據光源陣列計算光照並混合到 DIB
  • 每幀需先 Assign 回原圖,再重新計算光照(非累加)

擴展應用

  • 多光源:SetLength(a, N) 定義多個光源,如火把、法術特效、車燈
  • 彩色光照:Color := RGB(r,g,b) 實現紅/綠/藍氛圍燈
  • 動畫光源:用 Timer 更新 X,Y,Size1,Size2 產生脈動、閃爍、移動效果
  • 陰影模擬:結合遮罩或射線檢測,實現光源遮擋

效能提示

  • 光照計算為 CPU 端逐像素運算,大圖 + 多光源會降低幀率
  • 建議:降低解析度計算 → 放大繪製;或限制光源數量;或使用像素著色器(需 DirectX 9+)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved