Autor Beitrag
saite
Hält's aus hier
Beiträge: 15

Win 98
D7
BeitragVerfasst: Fr 25.06.04 22:16 
Hallo!

Nach unglaublich langer Suche und edlichen Tutorials komme ich einfach nicht mehr weiter und das noch ganz am Anfang.. ziemlich frustrierend...
also zu Problem:

Ich nutze Delphi 7 (unter win98) und versuche mit Delphi Direct3D zu initialisieren!
Das funktioniert auch soweit alles ganz gut bis auf :

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
 





procedure TSample3DForm.D3DInit; 
var 
  hr: HRESULT; 
  d3dpp: TD3DPRESENTPARAMETERS; 
begin 
  lpd3d:=Direct3DCreate8(D3D_SDK_VERSION); 
  if (lpd3d=nilthen FatalError(0,'Fehler beim erstellen von Direct3D!'); 
  ZeroMemory(@d3dpp,SizeOf(d3dpp)); 
  with d3dpp do 
    begin 
      SwapEffect:=D3DSWAPEFFECT_DISCARD; 
      hDeviceWindow:=Handle; 
      BackBufferCount:=1
      Windowed:=False; 
      BackBufferWidth:=640
      BackBufferHeight:=480
      BackBufferFormat:=D3DFind16BitMode; 
    end
    hr:=lpd3d.CreateDevice(D3DADAPTER_DEFAULT, 
                           D3DDEVTYPE_HAL, 
                           Handle, 
                           D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
                           d3dpp, 
                           lpd3ddevice); 
   if FAILED(hr) then FatalError(hr,'Fehler beim Erzeugen des 3D-Device!'); 
end


.



Ich bekomme immer diese Fehlermeldung:
"The method call is invalid. For example, a method's parameter may have an invalid value.
Fehler beim Erzeugen des 3D-Device!".

Ich habe alles genau so gemacht wie im Tutorial(www.delphi-source.de/tutorials/direct3d/) gemacht!

Hängt das irgendwie mit meiner Hardware zusammen?!?

Ich habe Directx9 installiert.. daran wird es auch wohl eher nicht liegen oder?(..mache das ja nach dem tut und da wirds mit 8 gemacht... wie auch immer.. ich habe eh schon 8.1 installiert und trotzdem geht nix!!!)

Bitte um Hilfe, ich habe nämlich wirklich sämtliche Parameter überprüft und verändert usw... aber nichts geht!?!?!?!?!?!?! :?:

mfG
Robert


Zuletzt bearbeitet von saite am Sa 26.06.04 14:24, insgesamt 1-mal bearbeitet
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Sa 26.06.04 11:22 
Sieht eigentlich auch alles ganz gut aus und die directX-schnittstellen sollten auch immer rückwärts kompatible sein, deshalb könnte es tatsächlich an den parametern liegen. Hast du schonmal 800x600x32Bit getestet, damit sollten die wenig´sten karten probleme haben.

Was noch interessant wäre, welche header du verwendest?

Oder mal versuchen ein device in einem fenster zu erstellen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var DGfxDM  : TD3DDisplayMode;
...
// windows farbtiefe auslesen
if failed(D3D9.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DGfxDm))
then exit;   
DGfxPP.BackBufferFormat := DGfxDm.Format;

_________________
mfg.
mâximôv
saite Threadstarter
Hält's aus hier
Beiträge: 15

Win 98
D7
BeitragVerfasst: Sa 26.06.04 12:54 
Danke schon mal für die Antwort!
Leider funktioniert das nicht.. :(
Ich habe heir jetzt mal meinen gesamten quellcode:


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
unit d3d;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Direct3D8, d3dx8;

type
  TSample3DForm = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    lpd3d: IDIRECT3D8;
    lpd3ddevice: IDIRECT3DDevice8;
    red, green, blue: byte;
    procedure FatalError(hr : HResult; FehlerMsg : string);
    function D3DFind16BitMode : TD3DFORMAT;
    procedure D3DInit;
    procedure D3DShutdown;
    procedure D3DInitScene;
    procedure D3DKillScene;
    procedure D3DRender;
  public
    { Public-Deklarationen }
  end;
type
  TMyVertex = record
    x,y,z,rhw: single;
    color: dword;
  end;
  TTriangleVertex = array [0..2of TMyVertex;
  TQuadratVertex = array [0..3of TMyVertex;

const
  D3D8T_CUSTOMVERTEX = D3DFVF_XYZRHW or D3DFVF_DIFFUSE;

  //Dreieck
  TriangleVertex: TTriangleVertex = (
    (x: 175.0; y: 50.0;  z: 0.5; rhw: 1.0; color: $000000FF),
    (x: 300.0; y: 300.0; z: 0.5; rhw: 1.0; color: $FFFF0000),
    (x: 50.0;  y: 300.0; z: 0.5; rhw: 1.0; color: $00FFFFFF));

  //Quadrat
  QuadratVertex: TQuadratVertex = (
    (x: 350.0; y: 300.0; z: 0.5; rhw: 1.0; color: $000000FF),
    (x: 350.0; y: 50.0;  z: 0.5; rhw: 1.0; color: $00FF0000),
    (x: 590.0; y: 300.0; z: 0.5; rhw: 1.0; color: $0000FFFF),
    (x: 590.0; y: 50.0;  z: 0.5; rhw: 1.0; color: $0000FF00));
           
var
  Sample3DForm: TSample3DForm;
  dxtriangle, dxsquare: IDirect3DVertexBuffer8;

implementation

{$R *.dfm}

procedure TSample3DForm.FormCreate(Sender: TObject);
begin
  lpd3d:=nil;
  lpd3ddevice:=nil;
  dxtriangle:=nil;
  dxsquare:=nil;
  red:=0;
  green:=0;
  blue:=0;
end;

procedure TSample3DForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_ESCAPE then close;
end;

procedure TSample3DForm.D3DInit;
var
  hr: HRESULT;
  d3dpp: TD3DPRESENTPARAMETERS;
begin
  lpd3d:=Direct3DCreate8(D3D_SDK_VERSION);
  if (lpd3d=nilthen FatalError(0,'Fehler beim erstellen von Direct3D!');
  ZeroMemory(@d3dpp,SizeOf(d3dpp));
  with d3dpp do
    begin
      SwapEffect:=D3DSWAPEFFECT_DISCARD;
      hDeviceWindow:=Handle;
      BackBufferCount:=1;
      Windowed:=False;
      BackBufferWidth:=640;
      BackBufferHeight:=480;
      BackBufferFormat:=D3DFind16BitMode;
    end;
    hr:=lpd3d.CreateDevice(D3DADAPTER_DEFAULT,
                           D3DDEVTYPE_HAL,
                           Handle,
                           D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                           d3dpp,
                           lpd3ddevice);
   if FAILED(hr) then FatalError(hr,'Fehler beim Erzeugen des 3D-Device!');
end;

procedure TSample3DForm.D3DShutdown;
begin
  if assigned(lpd3ddevice) then lpd3ddevice:=nil;
  if assigned(lpd3d) then lpd3d:=nil;
end;

procedure TSample3DForm.D3DInitScene;
var
  hr: HRESULT;
  vbVertices: pByte;
begin
  if assigned(lpd3ddevice) then with lpd3ddevice do
    begin
      hr:= CreateVertexBuffer(sizeof(TTriangleVertex),
                              D3DUSAGE_WRITEONLY,
                              D3D8T_CUSTOMVERTEX,
                              D3DPOOL_MANAGED,
                              dxtriangle);
      if FAILED(hr) then FatalError(0,'Fehler beim erstellen des Vertex Buffers für'+
        'das Dreieck!');

      hr:= CreateVertexBuffer(sizeof(TQuadratVertex),
                              D3DUSAGE_WRITEONLY,
                              D3D8T_CUSTOMVERTEX,
                              D3DPOOL_MANAGED,
                              dxsquare);
      if FAILED(hr) then FatalError(0,'Fehler beim erstellen des Vertex Buffers für'+
        'das Viereck!');

      with dxtriangle do
        begin
          hr:=Lock(00, vbVertices, 0);
          if FAILED(hr) then FatalError(0,'Fehler beim Locken des Buffers für die Dreiecke');
          Move(TriangleVertex, vbVertices^, sizeof(TTriangleVertex));
          Unlock;
        end;

      with dxsquare do
        begin
          hr:=Lock(00, vbVertices, 0);
          if FAILED(hr) then FatalError(0,'Fehler beim Locken des Buffers für die Quadrate');
          Move(QuadratVertex, vbVertices^, sizeof(TQuadratVertex));
          Unlock;
        end;
    end;
end;

procedure TSample3DForm.D3DKillScene;
begin
  dxtriangle:=nil;
  dxsquare:=nil;
end;

procedure TSample3DForm.FatalError(hr: HRESULT; FehlerMsg: string);
var
  s: string;
begin
  if hr<>0
    then s:=D3DXErrorString(hr) + #13 + FehlerMsg
    else s:=FehlerMsg;
  D3DKillScene;
  D3DShutDown;
  MessageDlg(s, mtError, [mbOK], 0);
  close;
end;

function TSample3DForm.D3DFind16BitMode;
var
  hr: HRESULT;
begin
  hr:=lpd3d.CheckDeviceType(D3DADAPTER_DEFAULT,
                            D3DDEVTYPE_HAL,
                            D3DFMT_R5G6B5,
                            D3DFMT_R5G6B5,
                            false);
  if (SUCCEEDED(hr)) then
    begin
      result:=D3DFMT_R5G6B5;
      exit;
    end;
  hr:=lpd3d.CheckDeviceType(D3DADAPTER_DEFAULT,
                            D3DDEVTYPE_HAL,
                            D3DFMT_X1R5G5B5,
                            D3DFMT_X1R5G5B5,
                            false);
  if (SUCCEEDED(hr)) then
    begin
      result:=D3DFMT_R5G6B5;
      exit;
    end;
  FatalError(0,'Der erforderliche D3D Modus wird von Iher Karte nicht unterstützt');
  result:=0;
end;

Procedure TSample3DForm.D3DRender;
begin
  if assigned(lpd3ddevice) then
    begin
      with lpd3ddevice do
        begin
          Clear(0,
                nil,
                D3DCLEAR_TARGET,
                D3DCOLOR_XRGB(red,green,blue),
                1,
                0);
          if SUCCEEDED(BeginScene) then
            begin
              SetVertexShader(D3D8T_CUSTOMVERTEX);
              SetStreamSource(0,dxtriangle,SizeOf(TMyVertex));
              DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
              SetStreamSource(0,dxsquare,SizeOf(TMyVertex));
              DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
              EndScene;
            end;
          Present(nilnil0nil);
        end;
    end;
end;

procedure TSample3DForm.FormShow(Sender: TObject);
begin
  D3DInit;
  D3DInitScene;
  D3DRender;
end;

end.


Die Fehler meldung bleibt leider!


Zuletzt bearbeitet von saite am Sa 26.06.04 14:22, insgesamt 1-mal bearbeitet
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Sa 26.06.04 14:18 
Hi,

versuch mal das Default BackBuffer-Format auszulesen und das zu setzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  D3DDM: TD3DDisplayMode;
{...}
  // Liest den aktuellen Desktop Display Mode
  if FAILED(lpd3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, D3DDM)) then exit;
{...}
    BackBufferWidth := 640;
    BackBufferHeight := 480;
    // BackBuffer-Eigenschaften des aktuellen Ausgabegeräts verwenden
    BackBufferFormat := D3DDM.Format;
  end;
{...}

btw: Es gibt auch [ delphi] Tags, nicht nur [ code] Tags. Benutz bitte in Zukunft [ delphi] Tags, wenn Du Delphi-Code postest. Mit Hilfe des user defined image-Buttons kannst Du auch vorherige Beiträge editieren und [ code] Tags durch [ delphi] Tags ersetzen.

raziel

//edit:
zu spät gelesen: maximus hat ja schon sowas gepostet, sorry! :autsch:

_________________
JSXGraph
Mechanic
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 30.06.04 09:01 
Titel: mit dx9
Hallo saite,

hier dass ganze mit DX9 und PresentParameter.
nur noch deine Vertex rein und sollte funktionieren.

Wenn eine DX Anwendung im Fullscreen Mode gestartet wird, MUSS der Backbuffer mit richtigen Werten gefüllt sein - sonst kommt es zu solchen Fehlermeldungen.
Ich nehme an, deine Graka kommt mit dem Mix aus Front und Backbuffer nicht klar (Nicht alle formate verstehen sich) Stichwort: Enumeration.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
unit d3dx9init;

interface

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

type
  TForm1 = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
    procedure AppOnIdle(Sender : TObject; var Done : BOOLEAN);
  public
    { Public-Deklarationen }
    procedure DXGFX_init;
    procedure Render;
    procedure DXGFX_close;
  end;


var
  Form1: TForm1;
  direct3D9 : IDirect3D9;
  d3ddev9   : IDirect3DDevice9;

implementation

{$R *.dfm}

procedure TForm1.DXGFX_init;
var
  d3dpp : Td3dPresentParameters;
  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         := TRUE;
d3dpp.BackBufferCount  := 1;
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
  begin
  Application.Terminate;
  exit;
  end;

end;


procedure TForm1.Render;
begin
d3ddev9.BeginScene;
d3ddev9.Clear(0,nil,D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 1.00);
d3ddev9.EndScene;

d3ddev9.Present(nil,nil,0,nil);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = VK_ESCAPE then
  begin
  Close;
  end;
end;

procedure TForm1.DXGFX_close;
begin
direct3D9 := nil;
d3ddev9   := nil;
end;

procedure TForm1.AppOnIdle(Sender : TObject; var Done : BOOLEAN);
begin
Done := FALSE;
Render;
end;




procedure TForm1.FormShow(Sender: TObject);
begin
DXGFX_init;
Application.OnIdle := AppOnIdle;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DXGFX_close;
end;

end.



Grüße
Mechanic