Managed DirectX C#
-
Hi
bin am verzweifeln. Habe eine Digitalkamera von der ich einzelne Bilder bekomme und zeige diese live an. Bisher hab ich diese Bilder unter C# einfach über
Graphics clientDC = PictureBox.CreateGraphics(); clientDC.DrawImage(pic, 0, 0);
oder auch
PictureBox.Image = pic;
anzeigen lassen. Das Funktioniert zwar, aber ich hab eine CPU-Auslastung von 100% und die kann ich nicht brauchen.
Darum hab ich mir gedacht ich versuchs mal mit Managed Direct3D und hab da mal so angefangen.private void LiveBildAnzeige() { PresentParameters presentParamsC = new PresentParameters(); presentParamsC.Windowed = true; presentParamsC.SwapEffect = SwapEffect.Discard; presentParamsC.DeviceWindow = PictureBox; // Create our device deviceC = new Device(0, DeviceType.Hardware, PictureBox, CreateFlags.SoftwareVertexProcessing, presentParamsC); vbC = new VertexBuffer(typeof(CustomVertex.PositionTextured), 6, deviceC, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); vbC.Created += new EventHandler(this.OnVertexBufferCreate); OnVertexBufferCreate(vbC, null); texC = new Texture(deviceC, new Bitmap( colorpic), 0, Pool.Managed); deviceC.Clear(ClearFlags.Target, Color.CornflowerBlue, 1.0f, 0); deviceC.Transform.Projection = Microsoft.DirectX.Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 100.0f); deviceC.Transform.View = Microsoft.DirectX.Matrix.LookAtLH(new Vector3(0,0, 18.0f), new Vector3(), new Vector3(0,1,0)); deviceC.RenderState.Lighting = false; deviceC.BeginScene(); deviceC.VertexFormat = CustomVertex.PositionTextured.Format; deviceC.SetStreamSource(0, vbC, 0); // Draw our boxes deviceC.SetTexture(0, texC); deviceC.DrawPrimitives(PrimitiveType.TriangleList, 0, 6); deviceC.EndScene(); deviceC.Present(); this.Invalidate(); } private void OnVertexBufferCreate(object sender, EventArgs e) { VertexBuffer buffer = (VertexBuffer)sender; CustomVertex.PositionTextured[] verts = new CustomVertex.PositionTextured[6]; // Front face verts[0] = new CustomVertex.PositionTextured(-1.0f, 1.0f, 1.0f, 0.0f, 0.0f); verts[1] = new CustomVertex.PositionTextured(-1.0f, -1.0f, 1.0f, 0.0f, 1.0f); verts[2] = new CustomVertex.PositionTextured(1.0f, 1.0f, 1.0f, 1.0f, 0.0f); verts[3] = new CustomVertex.PositionTextured(-1.0f, -1.0f, 1.0f, 0.0f, 1.0f); verts[4] = new CustomVertex.PositionTextured(1.0f, -1.0f, 1.0f,1.0f, 1.0f); verts[5] = new CustomVertex.PositionTextured(1.0f, 1.0f, 1.0f, 1.0f, 0.0f); buffer.SetData(verts, 0, LockFlags.None); }
Aber leider Funkioniert das nicht ganz so wies soll.
Das erste Problem ist ich bekomme nur ein Ausschnitt aus dem was ich aufnehme und das zweite Problem ist dass mir mein Programm nach ein paar durchläufen in denen ich das Bild in die Textur lade abbricht. Hab so das gefühl, dass ich nicht ganz die richtigen Funktionen für mein Problem hernehme, hab aber noch nichts besseres gefunden. Was mir auch nicht ganz begreiflich ist, ist dass das ganze mit D3D länger dauert, also ohne. Was das ganze noch erschwert, ich habe bisher noch nichts mit DirectX gemacht und die MSDN liefert für Managed DirectX noch keine wirkliche Hilfe.
Mit DirectDraw hab ichs schon versucht und da würds Funktionieren, aber ich möchte aus verschiedenen Gründen Direct3D nehmen, wenns denn geht.Danke schon mal für eure Hilfe
-
Versuch vielleicht mal statt
deviceC = new Device(0, DeviceType.Hardware, PictureBox, CreateFlags.SoftwareVertexProcessing, presentParamsC);
das:
deviceC = new Device(0, DeviceType.Hardware, PictureBox, CreateFlags.HardwareVertexProcessing, presentParamsC);
Ansonsten findest du hier noch was zu managed DX:
http://www.mycsharp.de/wbb2/thread.php?threadid=1613&sid=de719c27f7e589ee73e9416b21273671
http://www.pluralsight.com/craig/articleview.aspx/DirectX/Direct3D
http://www.drunkenhyena.com/cgi-bin/dx9.pl
-
Danke aber das hab ich schon mal versucht, aber dann bekomm ich gar kein Bild mehr.
Werd mir jetzt mal die Links anschaun ob ich da das passende finde