AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit DirectX und Texturen...
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit DirectX und Texturen...

Ein Thema von igel457 · begonnen am 13. Jan 2007 · letzter Beitrag vom 14. Jan 2007
Antwort Antwort
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Problem mit DirectX und Texturen...

  Alt 13. Jan 2007, 20:19
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
Angehängte Dateien
Dateityp: zip bin_172.zip (1,50 MB, 32x aufgerufen)
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

Re: Bitte Testen: DirectX und Texturen...

  Alt 13. Jan 2007, 21:31
Bei mir tut sich beim Klick auf den Button nichts ... und die raw-Datei ist leer!
Angehängte Dateien
Dateityp: zip log_915.zip (415 Bytes, 5x aufgerufen)
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#3

Re: Bitte Testen: DirectX und Texturen...

  Alt 13. Jan 2007, 22:16
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.
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Bitte Testen: DirectX und Texturen...

  Alt 14. Jan 2007, 09:27
Danke für eure Hilfe.
Zitat von BUG:
Bei mir tut sich beim Klick auf den Button nichts ... und die raw-Datei ist leer!
Das ist schlecht...

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 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.
Miniaturansicht angehängter Grafiken
temp3_125.png   temp2_987.png   temp1_411.png  
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#5

Re: Bitte Testen: DirectX und Texturen...

  Alt 14. Jan 2007, 10:05
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
Angehängte Dateien
Dateityp: txt test.raw_980.txt (64,0 KB, 5x aufgerufen)
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Bitte Testen: DirectX und Texturen...

  Alt 14. Jan 2007, 10:26
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
14. Jan 2007, 10:27
Dieses Thema wurde von "SirThornberry" von "Klatsch und Tratsch" nach "Multimedia" verschoben.
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Problem mit DirectX und Texturen...

  Alt 14. Jan 2007, 11:14
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]
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Problem mit DirectX und Texturen...

  Alt 14. Jan 2007, 11:44
Es ist mal wieder Zeit für den

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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  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 12:04 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