| Autor |
Beitrag |
saite
Hält's aus hier
Beiträge: 15
Win 98
D7
|
Verfasst: 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 :
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=nil) then 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var DGfxDM : TD3DDisplayMode; ... if failed(D3D9.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DGfxDm)) then exit; DGfxPP.BackBufferFormat := DGfxDm.Format; |
_________________ mfg.
mâximôv
|
|
saite 
Hält's aus hier
Beiträge: 15
Win 98
D7
|
Verfasst: 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:
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 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 end; type TMyVertex = record x,y,z,rhw: single; color: dword; end; TTriangleVertex = array [0..2] of TMyVertex; TQuadratVertex = array [0..3] of TMyVertex;
const D3D8T_CUSTOMVERTEX = D3DFVF_XYZRHW or D3DFVF_DIFFUSE;
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));
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=nil) then 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(0, 0, 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(0, 0, 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(nil, nil, 0, nil); 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
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Sa 26.06.04 14:18
Hi,
versuch mal das Default BackBuffer-Format auszulesen und das zu setzen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var D3DDM: TD3DDisplayMode;
if FAILED(lpd3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, D3DDM)) then exit;
BackBufferWidth := 640; BackBufferHeight := 480; 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  -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! 
_________________ JSXGraph
|
|
Mechanic
Hält's aus hier
Beiträge: 2
|
Verfasst: 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.
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 procedure AppOnIdle(Sender : TObject; var Done : BOOLEAN); public 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.0, 0); 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
|
|
|