Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit DirectX und Texturen... (https://www.delphipraxis.net/84243-problem-mit-directx-und-texturen.html)

igel457 13. Jan 2007 20:19


Problem mit DirectX und Texturen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe eine Bitte: Könnte jemand mal das angehängte Programm testen?
Es handelt sich um einen Test meiner 2D Engine. Problem ist das ich beim klick auf "Button 1" komische Grafikfehler erhalte (die Textur scheint kaputt zu sein), obwohl der Texturspeicherauszug (test.raw) völlig in Ordnung ist.

Mich würde interessieren, ob diese bei euch auch auftreten.
Ich habe nämlich schon über einen ähnlichen Fall irgendwo gelesen. Es hatte sich herausgestellt das die Grafikkarte kaputt war.

Das Programm schreibt zwei Dateien in seinen Arbeitspfad (eine Log und eben diese Test.raw, die man bei einer Größe von 128x128, 32BPP und BGR mit IrfanView einlesen kann und die direkt aus dem Texturspeicher stammt).

Danke für eure Hilfe,
Igel457

BUG 13. Jan 2007 21:31

Re: Bitte Testen: DirectX und Texturen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
:( Bei mir tut sich beim Klick auf den Button nichts ... und die raw-Datei ist leer!

JasonDX 13. Jan 2007 22:16

Re: Bitte Testen: DirectX und Texturen...
 
Hi

ich habe mal kurz dein Programm getestet und schnell durchgeguckt. Also wenn ich auf den button klicke, dann kriege ich keinen Texturfehler oder sowas, sondern ich sehe das selbe wie davor: naemlich Schwarz.
Aber erstmal deine 2 Dateien:
adlog.txt
[TAdDraw] [Info] AdDraw was created: 9:47:48 PM
[TAdDraw] [Info] Try to initialize Andorra Direct3D 9 Plugin.
[TAdDraw] [Info] Try to initialize the device.
[TAdDraw] [Info] Device supports 8 lights
[TAdDraw] [Info] 382MB Texture Memory on this device.
[TAdDraw] [Info] Initialization complete.
[TAdDraw] [Info] Changed point of view to a 2D Szene.
[TAdDraw] [Info] Finalization Complete.
[TAdDraw] [Info] Try to initialize Andorra Direct3D 9 Plugin.
[TAdDraw] [Info] Try to initialize the device.
[TAdDraw] [Info] Device supports 8 lights
[TAdDraw] [Info] 382MB Texture Memory on this device.
[TAdDraw] [Info] Initialization complete.
[TAdDraw] [Info] Changed point of view to a 2D Szene.
[TAdDraw] [Info] Finalization Complete.


In der test.raw steht lediglich eine 4Byte-grosse 0 drinnen.

So, nun etwas weiter im Detail: So wie ich das registriert habe, erstellst du zuerst eine Textur (A8R8G8B8, 1x1 Pixel) und einen VertexBuffer (4 Vertices zu je (XYZ, Normale, Diffuse Farbe und 1x Texturkoordinaten)). Die Textur fuellst du mit $00FF0000, und den Vertexbuffer mit 4 Vertices, die ein schwarzes Quadrat mit abnormalen Normalen ergeben. *g*
Beim Buttonklick resettest du wahrscheinlich etwas in deiner Engine, jedenfalls wird die Textur inklusive Device und allem drum und dran uebern Haufen geschmissen und neu erstellt. Davor (schaetze ich mal) holst du dir aber noch den Inhalt der Textur und speicherst ihn in die test.raw.
Ich behaupte, dass beim Speichern der Fehler liegt, da ich beim Debuggen vor ihrem letzten Lock die Textur immernoch als kunterbuntes rotes Pixel dargestellt bekomme.

Und schlussendlich: Keine Ahnung, obs absicht ist oder nicht, aber der Grund, warum ich vor und nach dem Button-klick schwarz sehe sind deine Projektions- und ViewMatrix. Die verzaubern das Quadrat in ein (fuer den Rasterizer zu) kleines Pixel an der linken, oberen Ecke des Viewports und fliegen damit aus der Pipeline.

greets
Mike

PS: Ich weiss nicht, ob du das warst oder wer auch immer DebugSetMute aufruft:
Die D3D-Doku besagt
DebugSetMute
Note This function is internal and not intended to be used by software developers.
:zwinker:

igel457 14. Jan 2007 09:27

Re: Bitte Testen: DirectX und Texturen...
 
Liste der Anhänge anzeigen (Anzahl: 3)
Danke für eure Hilfe.
Zitat:

Zitat von BUG
:( Bei mir tut sich beim Klick auf den Button nichts ... und die raw-Datei ist leer!

Das ist schlecht...

Zitat:

Zitat von JasonDX
So, nun etwas weiter im Detail: So wie ich das registriert habe, erstellst du zuerst eine Textur (A8R8G8B8, 1x1 Pixel) und einen VertexBuffer (4 Vertices zu je (XYZ, Normale, Diffuse Farbe und 1x Texturkoordinaten)). Die Textur fuellst du mit $00FF0000, und den Vertexbuffer mit 4 Vertices, die ein schwarzes Quadrat mit abnormalen Normalen ergeben. *g*
Beim Buttonklick resettest du wahrscheinlich etwas in deiner Engine, jedenfalls wird die Textur inklusive Device und allem drum und dran uebern Haufen geschmissen und neu erstellt. Davor (schaetze ich mal) holst du dir aber noch den Inhalt der Textur und speicherst ihn in die test.raw.
Ich behaupte, dass beim Speichern der Fehler liegt, da ich beim Debuggen vor ihrem letzten Lock die Textur immernoch als kunterbuntes rotes Pixel dargestellt bekomme.

Die liegst schon recht nahe an der Wirklichkeit:
Ich erstelle eine Textur A8R8G8B8 mit 128x128 Pixel, das mit dem Vertexbuffer stimmt. Die Textur fülle ich allerdings mit dem Inhalt von "fc.bmp".
Beim Butonklick schmeiße ich wirklich alles über den Haufen: Die Engine wird finalisiert, doch kurz davor mache ich eine Sicherungskopie von allen Texturen. Dann initialisere ich die engine wieder und lade die Texturen wieder zurück in den Speicher, dabei schreibe ich diese "test.raw".

Hier mein Code:
Delphi-Quellcode:
if FBitCount = 32 then
begin
  cur32 := d3dlr.pBits;
  pnt32 := ABmp.ScanLine;
  ms := TMemoryStream.Create;
  for y := 0 to ABmp.Height - 1 do
  begin
    for x := 0 to w - 1 do
    begin
      if (x < ABmp.Width) then
      begin
        cur32^ := D3DColor_ARGB(pnt32^.a,pnt32^.b,pnt32^.g,pnt32^.r);
        ms.Write(cur32^,sizeof(longword));
        inc(pnt32);
      end;
      inc(cur32);
    end;
  end;
  ms.SaveToFile('test.raw');
  ms.Free;
end;
ABmp ist mein eigens entwickelts Bitmap. Wenn ich cur32^ auf so was wie $FF00FF00 setzte funktioniert alles, doch bei dem aktuellen Quellcode wird das richtige in den MemoryStream geschrieben.

Kann mein Fehler (siehe auch Anhang) vielleicht daher kommen, das ich den Speicher für ABmp in der Host Anwendung reserviere, darauf aber in der DLL zugreife?

Zitat:

Zitat von JasonDX
Und schlussendlich: Keine Ahnung, obs absicht ist oder nicht, aber der Grund, warum ich vor und nach dem Button-klick schwarz sehe sind deine Projektions- und ViewMatrix. Die verzaubern das Quadrat in ein (fuer den Rasterizer zu) kleines Pixel an der linken, oberen Ecke des Viewports und fliegen damit aus der Pipeline.

Hmm...
Delphi-Quellcode:
procedure TDXApplication.Setup2DScene(AWidth, AHeight: integer);
var pos, dir, up : TD3DXVector3;
    matView, matProj: TD3DXMatrix;
begin
  if Direct3DDevice9 <> nil then
  begin
    pos := D3DXVector3 (Awidth/2,AHeight/2,-10);
    dir := D3DXVector3 (Awidth/2,AHeight/2,0);
    up := D3DXVector3 (0,-1,0);

    D3DXMatrixLookAtRH( matView, pos, dir, up);
    Direct3dDevice9.SetTransform(D3DTS_VIEW, matView);

    D3DXMatrixOrthoRH( matProj, Awidth, Aheight, 0,100);
    if Failed(Direct3dDevice9.SetTransform(D3DTS_PROJECTION, matProj)) then
    begin
      WriteLog(ltError,'Error while setting new view matrix.');
    end
    else
    begin
      WriteLog(ltInfo,'Changed point of view to a 2D Szene.');
    end;
  end;
end;
Sollte aber eigentlich gehen...

Nochmal danke für eure Hilfe,
igel457

PS: Da das ganze jetzt doch etwas Technischer wird könnte man diesen Thread vllt. doch nach "Multimedia" verschieben.

JasonDX 14. Jan 2007 10:05

Re: Bitte Testen: DirectX und Texturen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, ich bin das ganze jetzt nochmal durchgegangen, aber: Vorher habe ich die fc.bmp nach C:\ kopiert. Ich hatte mich vorher schon gewundert, dass er nich anmeckert, dass ich ploetzlich keine fc.bmp mehr hatte, bis ich draufkam, dass er die auf C:\ sucht.
Damit kriegt ers naemlich hin, die Textur zu laden, und ich krieg auch das bunte Dingsda in die 128x128-Textur. Der VertexBuffer wird auf die Groesse der Textur gesetzt. Nachdem die vorher nicht geladen werden konnte war das 1, jetzt isses ein etwas groesseres Quadrat, und wird mir auch wundervoll angezeigt. Und: Ich kriege auch endlich die selben Grafikfehler wie du.
Aber jetzt wirds richtig Strange: Die Textur-Debugging-Auszuege, sowie wenn ichs offline nochmal mit genau den selben vorgaben nachrendern lasse... das funktioniert alles einwandfrei, und wird ohne Probleme angezeigt.
D.h.: Ich glaub nich, dass hier eine GraKa hin is, oder irgendwas bei der Textur im Eimer is. Probier mal vor jedem Rendern die Textur nochmal zu setzen, vllt. haut was beim Sampler nich hin.

greetz
Mike

PS: Im Anhang der Texturauszug

igel457 14. Jan 2007 10:26

Re: Bitte Testen: DirectX und Texturen...
 
Mit dem C:\, das tut mir leid, habe wohl eine veraltete Version hochgeladen... Habs aber im ersten Beitrag verändert.
Zitat:

D.h.: Ich glaub nicht, dass hier eine GraKa hin is, oder irgendwas bei der Textur im Eimer is. Probier mal vor jedem Rendern die Textur nochmal zu setzen, vllt. haut was beim Sampler nich hin.
Dies habe ich versucht, in dem ich einen Teil meiner Render-Prozedur auskommentiert habe...
Delphi-Quellcode:
Direct3DDevice9.SetTransform(D3DTS_WORLDMATRIX(0), FMatrix);
{if (FLastTexture <> FTexture) and (FTexture <> nil) and (FTexture.Loaded) then
begin
  FLastTexture := FTexture;}
  Direct3DDevice9.SetTexture(0,IDirect3DTexture9(FTexture.Texture));
//end;
Direct3DDevice9.SetStreamSource(0, FVertexBuffer, 0, sizeof(TD3DLVertex));
Direct3DDevice9.SetFVF(D3DFVF_TD3DLVertex);
if UseIndexBuffer then
begin
  Direct3DDevice9.SetIndices(FIndexBuffer);
  Direct3DDevice9.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, VertexCount, 0, FPrimitiveCount);
end
else
begin
  Direct3DDevice9.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, FPrimitiveCount);
end;
Macht überhaupt keine Veränderung.
Ich bin mittlerweile fast am verzweifeln. Besonders, wenn ich die Farbe jedes Texels "per Hand" setze geht es ja!

Danke an alle und besonders an JasonDX für seine Mühen!

@JasonDX
Falls dich mein Kompletter DirectX Sourcecode interessieren sollte, den gibts hier.

DP-Maintenance 14. Jan 2007 10:27

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Klatsch und Tratsch" nach "Multimedia" verschoben.

igel457 14. Jan 2007 11:14

Re: Problem mit DirectX und Texturen...
 
Ich bin jetzt schon mal einen ganzen Schritt weiter: Tatsächlich scheint es am AlphaChannel der Textur zu liegen.

Delphi-Quellcode:
          if (x < ABmp.Width) then
          begin
            t := D3DColor_ARGB(128,pnt32^.b,pnt32^.g,pnt32^.r);
//            t := $FF000000 or t;
            cur32^ := t;
            inc(pnt32);
          end;
So geht es...

[Edit]Der Alphachannel wird auch tatsächlich falsch in die Datei gespeichert und nur dieses sch**ß IrfanView ließt diesen nicht richtig aus.
Also liegt der Fehler vermutlich doch irgendwo in meinem Code.
[/Edit]

igel457 14. Jan 2007 11:44

Re: Problem mit DirectX und Texturen...
 
Es ist mal wieder Zeit für den
:wall:
Smiley.

Denn ich habe den Fehler gefunden. Ein Auszug aus der Textur wieder aus dem Texturspeicher auslesen Prozedur:
Delphi-Quellcode:
ptr32^.a := Cur32^ shr 24; //<--Man sollte diese Zeile nicht vergessen!
ptr32^.b := Cur32^ shr 16;
ptr32^.g := Cur32^ shr 8;
ptr32^.r := Cur32^;
Trotz meines (wie fast jedes mal) blöden Fehlers, ein dickes Danke an alle!

Igel457


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz