#1 25.01.2007 11:53:28

Visioner
ProMember
Registriert: 15.02.2006
Beiträge: 123

Windows Fenster Resize. Neue Breite und Höhe setzen

Hi,

DirectX läuft im  Windows-Fenster. Wenn ich das Fenster jetzt vergrößere oder verkleinere fehlt mir noch das Setzen der richtigen Width und Height.

Ich habe es schon mit TD3DPresentParameters und Pd3dDevice.Reset probiert, aber irgendwie bekomme ich das nicht hin.

Was muss ich tun?

Gruß Visioner

Offline

 

#2 25.01.2007 11:59:05

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Reset ist schon der richtige Weg mit den aktuellen D3DPRESENT_PARAMETERS. Aber damit ist es nicht unbedingt erledigt - alles was du an Texturen, VBs, IB, Effects, etc. nicht managed erzeugt hast musst du danach selbst wieder neu erzeugen und eventuell vorhandene Referenzen korrigieren.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#3 25.01.2007 12:08:07

Visioner
ProMember
Registriert: 15.02.2006
Beiträge: 123

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Hast Du da mal ein Code - Beispiel vom setzen von den neuen TD3DPresent_Parameters.

Offline

 

#4 26.01.2007 19:07:04

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Was für ein Codebeispiel erwartest du denn? Das hängt ganz von dem ab was du benötigst - und die presentparams musst du ja beim init schon mal gesetzt haben. Dementsprechend übergibst du dann das selbe (bis auf die neue width/height) beim reset. Aber wie gesagt - alles was nicht managed ist musst du anschliessend selbst neu erzeugen.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#5 02.02.2007 09:55:06

Visioner
ProMember
Registriert: 15.02.2006
Beiträge: 123

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Also bei mir ist alles Managed!
Ich will jetzt nur Width und Height neu setzen. Alles im Windows-Mode! Kein Vollbild!

Initialisierungsroutine:

Code: delphi

function dhinitdgfx(_hwnd: 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;

  // Initialisieren des IDirect3D9-Interfaces
  _idirect3d9 := direct3dcreate9(d3d_sdk_version);
  if (_idirect3d9 = nil) then exit;

  // Festlegen der richtigen Present_Parameters
  fillchar(_d3dpp, sizeof(_d3dpp), 0);
  with _d3dpp do begin
    windowed      := not _fullscreen;
    swapeffect      := d3dswapeffect_discard;
    // Wenn die Anwendung im Vollbildmodus laufen soll...
    if (_fullscreen) then begin
      backbufferwidth  := _width;                  // ...wird die Auflösung
      backbufferheight := _height;                 // festgelegt...
      case _bits of                                 //
        16 : backbufferformat := d3dfmt_r5g6b5;    // ...und eins von zwei
        32 : backbufferformat := d3dfmt_a8r8g8b8;  // Standarformaten genommen
        else exit;
      end;
    end else begin
    // Ansonsten wird das aktuelle Format übernommen
      if failed( _idirect3d9.getadapterdisplaymode(
                 d3dadapter_default , _d3ddm ) ) then exit;
      backbufferformat := _d3ddm.format;
    end;
    enableautodepthstencil := true;
    autodepthstencilformat := d3dfmt_d24s8; //D3DFMT_D24X8; //D3DFMT_D24S8; //D3DFMT_D16 ;
  end;

  // Konntrolliert, ob die Karte Hardwarevertexprocessing unterstützt
  _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;

  // Erstellt das IDirect3DDevice9
  if _hal then _dtype := d3ddevtype_hal else _dtype := d3ddevtype_ref;
  if failed( _idirect3d9.createdevice(d3dadapter_default, _dtype, _hwnd,
                                      vertexprocessing, @_d3dpp,
                                      _idirect3ddevice9)) then begin
    exit;
  end;
  // Alles fehlerfrei gelaufen
  result := true;
end;




Änderungsroutine zum setzen der neuen width und height:

Code: delphi

var i,e:integer;
  _d3dpp                   : td3dpresent_parameters;
  _d3ddm                   : td3ddisplaymode;
  _dtype                   : td3ddevtype;
  d3dcaps9                 : td3dcaps9;
  hardwarevertexprocessing : boolean;
  vertexprocessing         : integer;
  resi:hresult;
begin
  fillchar(_d3dpp, sizeof(_d3dpp), 0);
  with _d3dpp do begin
    windowed      := true;
    swapeffect      := d3dswapeffect_discard;
    if failed( neobaserr.neodirect3d9.getadapterdisplaymode(
               d3dadapter_default , _d3ddm ) ) then exit;
    backbufferformat := _d3ddm.format;
    backbufferwidth:=displaypanel.width;
    backbufferheight:=displaypanel.height;
    enableautodepthstencil := true;
    autodepthstencilformat := d3dfmt_d24s8; //D3DFMT_D24X8; //D3DFMT_D24S8; //D3DFMT_D16 ;
  end;
  resi:=neobaserr.neopd3ddevice.reset (_d3dpp);
  showmessage (dxgeterrorstring9 (resi));
  // D3DERR_INVALIDCALL


Als Ergebnis bekomme ich D3DERR_INVALIDCALL?!
Was mache ich falsch!

Offline

 

#6 04.12.2011 13:27:04

Gewuerzgurke
Member
Registriert: 15.09.2008
Beiträge: 47
Web-Seite

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Das Thema ist je jetzt schon älter, aber ich habe das gleiche Problem.
Wenn ich IDirect3DDevice9.Reset(TD3DPresent_Parameters) aufrufe, sind alle Texturen schwarz. Die TD3DPresent_Parameters habe ich genauso erzeugt, wie vorher auch (nur mit anderer Auflösung). Die Texturen werden auch erst geladen, nachdem ich Reset aufrufe.

Was ist denn mit dem managed gemeint? Was muss ich machen, damit die Texturen wieder da sind?

Und: Als TD3DPresent_Parameters nehme ich im Moment die gleiche Variable, wie die, die ich bei CreateDevice übergebe. Ist das irgendwie problematisch?

Offline

 

#7 04.12.2011 13:35:17

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Wenn du Texturen erstellst gibst du ja einen D3DPOOL an. Wenn du die Texturen mit D3DPOOL_MANAGED erstellst, dann werden sie im Hauptspeicher gehalten und sind bei einem Device-Reset wieder verfügbar. Du musst nur aufpassen das du alles was nicht in diesem Pool erzeugt wurde neu erzeugen musst.


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#8 04.12.2011 15:12:15

Gewuerzgurke
Member
Registriert: 15.09.2008
Beiträge: 47
Web-Seite

Re: Windows Fenster Resize. Neue Breite und Höhe setzen

Aha, das klingt logisch...
Nur werden ja meine Texturen erst nach dem Reset erzeugt... Habe nochmal genau hingeschaut und das Problem gelöst.

Mein Fehler: Ich verwende kein Licht. Also "D3DDev9.SetRenderState(D3DRS_LIGHTING,0);". Diese Einstellung muss man auch erneuern. Am besten, ich packe alle diese Einstellungen in eine separate Procedure und die rufe ich dann beim Programmstart und beim ändern der Größe (Das nur bis zum Start der Hauptanimation mit den Texturen etc. möglich ist) auf.

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson