AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DirectX9 initialisierungsproblem
Thema durchsuchen
Ansicht
Themen-Optionen

DirectX9 initialisierungsproblem

Ein Thema von snoopy1602 · begonnen am 28. Jul 2008 · letzter Beitrag vom 29. Jul 2008
Antwort Antwort
snoopy1602

Registriert seit: 17. Mär 2005
Ort: Lübeck
67 Beiträge
 
Turbo Delphi für Win32
 
#1

DirectX9 initialisierungsproblem

  Alt 28. Jul 2008, 18:00
Hi Leute! Ich versuche mit Turbo Delphi Explorer das Buch DirectX9 mit Delphi durchzuarbeiten. Ich habe aber jetzt folgendes Problem:

Ich habe den Quelltext so eingegeben so wie er im Buch steht und natürlich auch die entsprechenden DirectX units mit eingebungen.
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, direct3d9, d3dx9;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure OnIdle(Sender: Tobject; var done: boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  direct3d9: IDirect3d9;
  d3ddev9: idirect3ddevice9;

implementation

{$R *.dfm}

function dhinitdgfx(_handle: hwnd; _fullscreen: boolean;
                    _width, _height, _bits: longint;
                    _hal: boolean; out _idirect3d9: idirect3d9;
                    out _idirect3ddevice9: idirect3ddevice9): boolean;
var
  d3dpp : td3dpresent_parameters;
  d3ddm : td3ddisplaymode;
  dtype : td3ddevtype;
  d3dcaps9 : td3dcaps9;
  hardwarevertexprocessing : boolean;
  vertexprocessing : integer;

begin
  result:= false;

  _idirect3d9:= direct3dcreate9(d3d_sdk_version);
  if (_idirect3d9 = nil) then exit;

  fillchar(d3dpp, sizeof(d3dpp), 0);
  with d3dpp do begin
                  windowed:= not _fullscreen;
                  swapeffect:= d3dswapeffect_discard;

                  if (_fullscreen) then
                    begin
                      backbufferwidth:= _width;
                      backbufferheight:= _height;
                      case _bits of
                        16: backbufferformat:= d3dfmt_r5g6b5;
                        32: backbufferformat:= d3dfmt_a8r8g8b8;
                        else exit;
                      end;
                    end else begin
                                if failed(_idirect3d9.GetAdapterDisplayMode(d3dadapter_default, d3ddm)) then
                                  exit;

                      backbufferformat:= d3ddm.Format;
                    end;

  end;
  _idirect3d9.GetDeviceCaps(d3dadapter_default, d3ddevtype_hal, d3dcaps9);

  hardwarevertexprocessing:= d3dcaps9.DevCaps and d3ddevcaps_hwtransformandlight <> 0;

  if hardwarevertexprocessing then
    vertexprocessing:= d3dcreate_hardware_vertexprocessing

    else
      vertexprocessing:= d3dcreate_software_vertexprocessing;

      if _hal then
        dtype:= d3ddevtype_hal
        else
          dtype:= d3ddevtype_ref;


              
      result:= true;
      
end;

procedure dxgfx_init;
var
  d3dpp: td3dpresent_parameters;
  d3ddm: td3ddisplaymode;
begin
  direct3d9:= direct3dcreate9(d3d_sdk_version);
  if direct3d9 = nil then
    begin
      exit;
    end;

    if (not direct3d9.GetAdapterDisplayMode(d3dadapter_default, d3ddm)= d3d_ok) then
    begin
      application.terminate;
      exit;
    end;

    fillchar(d3dpp, sizeof(d3dpp), 0);

    d3dpp.windowed:= false;
    d3dpp.BackBufferWidth:= d3ddm.Width;
    d3dpp.BackBufferHeight:= d3ddm.Height;
    d3dpp.BackBufferFormat:= d3ddm.Format;
    d3dpp.SwapEffect:= d3dswapeffect_discard;

    [b]direct3d9.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, form1.Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp, d3ddev9);[/b] // Diese Zeile wird bei mir als Fehler markiert//
                                   




end;

procedure dhclosedgfx(_idirect3d9: idirect3d9; _idirect3ddevice9: idirect3ddevice9);
begin
  _idirect3ddevice9:= nil;
  _idirect3d9:= nil;
end;

procedure render;
begin
  d3ddev9.BeginScene;
  d3ddev9.Clear(0, nil, d3dclear_target, d3dcolor_argb(0,0,0,0),1.0, 0);
  d3ddev9.EndScene;
  d3ddev9.Present(nil, nil, 0, nil);
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  dhclosedgfx(direct3d9, d3ddev9);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
dhinitdgfx(handle, false, 0,0,0, true, direct3d9, d3ddev9);
application.OnIdle:= onidle;
end;

procedure tform1.OnIdle(Sender: TObject; var done: Boolean);
begin
  done:= false;
  render;
end;

end.
Ich bin echt ratlos! Ich finde den Fehler einfach nicht!

Als Fehlermeldung wird mir folgendes beim compilieren ausgegeben:

[Pascal Fehler] main.pas(115): E2010 Inkompatible Typen: 'PD3DPresentParameters' und '_D3DPRESENT_PARAMETERS_'

Wie kann das sein?

[edit=Sharky]Delphi-Tags gesetzt. Zukünftig bitte selber machen. Danke. Mfg, Sharky[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: DirectX9 initialisierungsproblem

  Alt 29. Jul 2008, 05:19
Kannst du deinen Quelltext bitte mal in Delphi-Tags setzen ?


Erster Fehler:

Die gleichen Namen in der Uses-Klausel

Code:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, [b][color=#ff0000]direct3d9[/color][/b], d3dx9;
und als Variable

Code:
var
  Form1: TForm1;
  [b][color=#ff0000]direct3d9[/color][/b]: IDirect3d9;
  d3ddev9: idirect3ddevice9;
Lösung: Variable umbenennen.

Delphi-Quellcode:
var
  Form1: TForm1;
  direct3d9_: IDirect3d9; // <--<<
  d3ddev9: idirect3ddevice9;

Zweiter Fehler:

Delphi-Quellcode:
direct3d9_.CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    Handle,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    @d3dpp, // <--<< sollte glaube ich ein Pointer sein
    d3ddev9);
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
snoopy1602

Registriert seit: 17. Mär 2005
Ort: Lübeck
67 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: DirectX9 initialisierungsproblem

  Alt 29. Jul 2008, 08:58
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, direct3d9, d3dx9;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure OnIdle(Sender: Tobject; var done: boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  direct3d9_: IDirect3d9;
  d3ddev9: idirect3ddevice9;

implementation

{$R *.dfm}

function dhinitdgfx(_handle: hwnd; _fullscreen: boolean;
                    _width, _height, _bits: longint;
                    _hal: boolean; out _idirect3d9: idirect3d9;
                    out _idirect3ddevice9: idirect3ddevice9): boolean;
var
  d3dpp : td3dpresent_parameters;
  d3ddm : td3ddisplaymode;
  dtype : td3ddevtype;
  d3dcaps9 : td3dcaps9;
  hardwarevertexprocessing : boolean;
  vertexprocessing : integer;

begin
  result:= false;

  direct3d9_:= direct3dcreate9(d3d_sdk_version);
  if (direct3d9_ = nil) then exit;

  fillchar(d3dpp, sizeof(d3dpp), 0);
  with d3dpp do begin
                  windowed:= not _fullscreen;
                  swapeffect:= d3dswapeffect_discard;

                  if (_fullscreen) then
                    begin
                      backbufferwidth:= _width;
                      backbufferheight:= _height;
                      case _bits of
                        16: backbufferformat:= d3dfmt_r5g6b5;
                        32: backbufferformat:= d3dfmt_a8r8g8b8;
                        else exit;
                      end;
                    end else begin
                                if failed(_idirect3d9.GetAdapterDisplayMode(d3dadapter_default, d3ddm)) then
                                  exit;

                      backbufferformat:= d3ddm.Format;
                    end;

  end;
  _idirect3d9.GetDeviceCaps(d3dadapter_default, d3ddevtype_hal, d3dcaps9);

  hardwarevertexprocessing:= d3dcaps9.DevCaps and d3ddevcaps_hwtransformandlight <> 0;

  if hardwarevertexprocessing then
    vertexprocessing:= d3dcreate_hardware_vertexprocessing

    else
      vertexprocessing:= d3dcreate_software_vertexprocessing;

      if _hal then
        dtype:= d3ddevtype_hal
        else
          dtype:= d3ddevtype_ref;



      result:= true;
      
end;

procedure dxgfx_init;
var
  d3dpp: td3dpresent_parameters;
  d3ddm: td3ddisplaymode;
begin
  direct3d9.Direct3DCreate9(d3d_sdk_version);
  if direct3d9.Direct3DCreate9(d3d_sdk_version) = nil then
    begin
      exit;
    end;

    if (not direct3d9_.getadapterdisplaymode(d3dadapter_default, d3ddm)= d3d_ok) then
    begin
      application.terminate;
      exit;
    end;

    fillchar(d3dpp, sizeof(d3dpp), 0);

    d3dpp.windowed:= false;
    d3dpp.BackBufferWidth:= d3ddm.Width;
    d3dpp.BackBufferHeight:= d3ddm.Height;
    d3dpp.BackBufferFormat:= d3ddm.Format;
    d3dpp.SwapEffect:= d3dswapeffect_discard;

    if (not direct3d9_.CreateDevice(d3dadapter_default, d3ddevtype_hal, form1.Handle, d3dcreate_software_vertexprocessing, @d3dpp, d3ddev9)=d3d_ok) then
        application.Terminate;

end;

procedure dhclosedgfx(_idirect3d9: idirect3d9; _idirect3ddevice9: idirect3ddevice9);
begin
  _idirect3ddevice9:= nil;
  _idirect3d9:= nil;
end;

procedure render;
begin
  d3ddev9.BeginScene;
  d3ddev9.Clear(0, nil, d3dclear_target, d3dcolor_argb(0,0,0,0),1.0, 0);
  d3ddev9.EndScene;
  d3ddev9.Present(nil, nil, 0, nil);
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  dhclosedgfx(direct3d9_, d3ddev9);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
dhinitdgfx(handle, false, 0,0,0, true, direct3d9_, d3ddev9);
application.OnIdle:= onidle;
end;

procedure tform1.OnIdle(Sender: TObject; var done: Boolean);
begin
  done:= false;
// render;
end;

end.
Mein Quelltext sieht jetzt so aus. Sobald ich jedoch den Befehl render; reaktiviere stürzt das Programm mit folgender Fehlermeldung ab:

"Im Project1.exe ist eie Exception der Klasse EAccesViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0045236A in Modul 'Project1.exe'. Lesen von Adresse 00000000' aufgetreten."
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: DirectX9 initialisierungsproblem

  Alt 29. Jul 2008, 13:04
Ja, weil die Initialisierung noch fehlt. die Procediure "dxgfx_init" wird nirgens wo aufgerufen.
( wenn ich mich nicht verguckt habe )
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
snoopy1602

Registriert seit: 17. Mär 2005
Ort: Lübeck
67 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: DirectX9 initialisierungsproblem

  Alt 29. Jul 2008, 18:35
Danke das war der Fehler. Jetzt hängt das Programm zwar in Moment in einer Endlosschleife, aber ich habe zumindest endlich mal einen grauen Hintergrund.

Auch den Fehler habe ich gefunden. Ich hatte die beiden Zeilen vertauscht. Jetzt habe ich endlich einen schwarzen Bildschirm.

Code:
dhinitdgfx(handle, false, 0,0,0, true, direct3d9, d3ddev9);
dxgfx_init;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz