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.