![]() |
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 |
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!
|
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. |
Re: Bitte Testen: DirectX und Texturen...
Liste der Anhänge anzeigen (Anzahl: 3)
Danke für eure Hilfe.
Zitat:
Zitat:
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:
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.
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; 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:
Delphi-Quellcode:
Sollte aber eigentlich gehen...
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; 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. |
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 |
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:
Delphi-Quellcode:
Macht überhaupt keine Veränderung.
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; 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 ![]() |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Klatsch und Tratsch" nach "Multimedia" verschoben.
|
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:
So geht es...
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; [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] |
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:
Trotz meines (wie fast jedes mal) blöden Fehlers, ein dickes Danke an alle!
ptr32^.a := Cur32^ shr 24; //<--Man sollte diese Zeile nicht vergessen!
ptr32^.b := Cur32^ shr 16; ptr32^.g := Cur32^ shr 8; ptr32^.r := Cur32^; 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