简单封装 Delphi 的 DirectX类

这篇博客介绍了如何在Delphi中简单封装DirectX类,用于创建渲染器。通过构造函数和析构函数,实现了对Direct3D的初始化和释放。文章详细展示了窗体代码中的关键部分,为Delphi开发者提供了实现图形渲染的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var
  CreatorRenderer  : TCreatorRenderer;
  Form1: TForm1;

窗体代码:

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 创建
  CreatorRenderer := TCreatorRenderer.Create();
  CreatorRenderer.CreateDevice(self.Handle,self.Width,Self.Height ,true);

  // 开启定时器
  Timer1.Enabled := True;
end;

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

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  CreatorRenderer.BeginRender();
  CreatorRenderer.EndRender();
end;


 

// 下面是封装的渲染器类

 

// 渲染器类
// warrially
unit xCreatorRenderer;

interface
  uses Direct3D9, D3DX9, Windows;
type
  TCreatorRenderer = class(TObject)
    private
      // D3D基本参数
      m_d3dpp   : D3DPRESENT_PARAMETERS;

    private class var
      m_pDevice : IDirect3DDevice9;   //设备
      m_pSprite : ID3DXSprite;        //精灵

    public
      constructor Create;
      destructor Destroy; override;
    public
      // 创建设备 (容器句柄, 宽, 高, 是否窗口化)
      function CreateDevice(hWnd:HWND ; nWidth : Integer ; nHeight : Integer ; bWindowed : Boolean):Boolean;
      // 开始渲染
      procedure BeginRender();
      // 结束渲染
      procedure EndRender();
      // 开始精灵渲染
      procedure BeginRenderSprite();
      // 结束精灵渲染
      procedure EndRenderSprite();

      // 获取设备指针
      class function GetDevice():IDirect3DDevice9;
      // 获取精灵指针
      class function GetSprite():ID3DXSprite;
  end;
implementation

{ TCreatorRenderer }
// 开始渲染
procedure TCreatorRenderer.BeginRender;
begin
  m_pDevice.Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER, 0, 1.0, 0);
  m_pDevice.BeginScene();
end;

procedure TCreatorRenderer.BeginRenderSprite;
begin
  m_pSprite._Begin(D3DXSPRITE_ALPHABLEND);
end;

constructor TCreatorRenderer.Create;
begin

end;

function TCreatorRenderer.CreateDevice(hWnd: HWND; nWidth, nHeight: Integer;
  bWindowed: Boolean): Boolean;
var
  pD3d9   : IDirect3D9;
  myhResult : HResult ;
begin
  pD3d9 := Direct3DCreate9(D3D_SDK_VERSION);
  if (pD3d9 = nil) then
  begin
    OutputDebugString('Direct3D create failed.');
    Result := False;
    Exit;
  end;

  m_d3dpp.BackBufferWidth            := nWidth;
  m_d3dpp.BackBufferHeight           := nHeight;
  m_d3dpp.BackBufferFormat           := D3DFMT_A8R8G8B8;
  m_d3dpp.BackBufferCount            := 1;
  m_d3dpp.MultiSampleType            := D3DMULTISAMPLE_NONMASKABLE;
  m_d3dpp.MultiSampleQuality         := 0;
  m_d3dpp.SwapEffect                 := D3DSWAPEFFECT_DISCARD;
  m_d3dpp.hDeviceWindow              := hWnd;
  m_d3dpp.Windowed                   := bWindowed;
  m_d3dpp.EnableAutoDepthStencil     := true;
  m_d3dpp.AutoDepthStencilFormat     := D3DFMT_D24S8;
  m_d3dpp.Flags                      := 0;
  m_d3dpp.FullScreen_RefreshRateInHz := D3DPRESENT_RATE_DEFAULT;
  m_d3dpp.PresentationInterval       := D3DPRESENT_INTERVAL_IMMEDIATE;

  myhResult := pD3d9.CreateDevice( D3DADAPTER_DEFAULT,
                                   D3DDEVTYPE_HAL,
                                   hWnd,
                                   D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                   @m_d3dpp,
                                   m_pDevice);

  if (FAILED(myhResult))  then
	begin
			OutputDebugString('D3D device create failed.');
			Result := false;
      Exit;
	end;

  myhResult := D3DXCreateSprite(m_pDevice, m_pSprite);
  if (FAILED(myhResult))  then
	begin
			OutputDebugString('D3D sprite create failed.');
			Result := false;
      Exit;
	end;

  OutputDebugString('Renderer create succeed.');
  Result := True;


end;

destructor TCreatorRenderer.Destroy;
begin

  inherited;
end;

procedure TCreatorRenderer.EndRender;
begin
	m_pDevice.EndScene();
  m_pDevice.Present(nil, nil, 0, nil);
end;

procedure TCreatorRenderer.EndRenderSprite;
begin
  m_pSprite._End();
end;

class function TCreatorRenderer.GetDevice: IDirect3DDevice9;
begin
  Result := m_pDevice;
end;

class function TCreatorRenderer.GetSprite: ID3DXSprite;
begin
  Result := m_pSprite;
end;


end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值