Direct3D Dreieck verschwindet
-
Hallo!
Irgendwer mit Directx-Kentnissen Online?
Ich bin Einsteiger und habe nach einigen Tutorials ein Dreieck erscheinen lassen.
Nach dem Tutorial, mit dem ich mich geraden beschäftige sollen die CustomVertex vonCustomVertex.TransformedColored[]
auf
CustomVertex.PositionColored[]
umgestellt werden.
Wenn ich dies tue, verschwindet das Dreieck...
Falls es hilft, hier mein bisheriger Code:public class DirectXWindow : System.Windows.Forms.Form { private Device device; private PresentParameters pParameters = new PresentParameters(); private CustomVertex.TransformedColored[] verts; private VertexBuffer vertexBuffer; public void InitGraphics() { try { //Display-Einstellungen this.TopMost = true; this.FormBorderStyle = FormBorderStyle.FixedSingle; this.ClientSize = new Size(640, 480); this.Text = "DIRECTXGAME"; pParameters.Windowed = true; pParameters.SwapEffect = SwapEffect.Copy; device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, pParameters); device.RenderState.CullMode = Cull.None; this.KeyPress += new KeyPressEventHandler(this.OnKeyPress); } catch { MessageBox.Show("Fehler beim Initialisieren!"); } //Mit Inhalt füllen verts = new CustomVertex.TransformedColored[3]; verts[0].X = 130; verts[0].Y = 50; verts[0].Z = 0.5f; // verts[0].Rhw = 1; verts[0].Color = Color.Black.ToArgb(); verts[1].X = 250; verts[1].Y = 220; verts[1].Z = 0.5f; // verts[1].Rhw = 1; verts[1].Color = Color.Black.ToArgb(); verts[2].X = 50; verts[2].Y = 250; verts[2].Z = 0.5f; // verts[2].Rhw = 1; verts[2].Color = Color.Red.ToArgb(); vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), 3, device, Usage.WriteOnly, CustomVertex.TransformedColored.Format, Pool.Default); GraphicsStream gStream = vertexBuffer.Lock(0, 0, 0); gStream.Write(verts); vertexBuffer.Unlock(); } public void Render() { device.Clear(ClearFlags.Target, Color.Black, 0.0f, 0); device.BeginScene(); //rendering device.VertexFormat = CustomVertex.TransformedColored.Format; device.RenderState.FillMode = FillMode.Solid; int iTime = Environment.TickCount % 1000; float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f; device.Transform.World = Matrix.RotationY(fAngle); /* Matrix world; world = Matrix.Scaling(1.0f, 1.0f, 1.0f); world *= Matrix.RotationY(1.0f); world *= Matrix.Translation(1.0f, 0.0f, 0.0f); device.Transform.World = world; device.Transform.World = Matrix.Identity;*/ device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 3.0f, -5.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f)); device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f); device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 1, verts); device.EndScene(); device.Present(); } public void Exit() { device.Dispose(); } private void OnKeyPress(object sender, KeyPressEventArgs e) { if ((int)e.KeyChar == (int)Keys.Escape) Exit(); this.Close(); } }
Weiß jemand Rat?
-
Habs nur überflogen, aber was mir aufgefallen ist:
In dem Code ist der Vertextyp noch immer TransformedColored. Beabsichtigt?
Ist es gewollt, dass sowohl die Clear Color als auch die Farbe von Vertex0 und 1 schwarz ist?
-
Das RHW deiner Vertices musst du schon auf 1 setzen. Wenn du willst dass deine Vertices transformiert werden darfst du kein Vertexformat mit vortransformierten Positionen verwenden. Wofür erstellst du einen VertexBuffer wenn du ihn dann nicht verwendest?
-
Vorab danke für die Antworten.
Ja, der Codeausschnitt ist sehr unglücklich gewählt.
Wenn ich den CustomVertex auf TransformedColored stelle, funktioniert alles perfekt, die Zeilen mit dem Rhw sind dann NICHT auskommentiert.
Wenn ich aber auf PositionColored stelle, dann werden die Rhws rot unterkringelt und VisualStudio sagt,Error 1 'Microsoft.DirectX.Direct3D.CustomVertex.PositionColored' does not contain a definition for 'Rhw' and no extension method 'Rhw' accepting a first argument of type 'Microsoft.DirectX.Direct3D.CustomVertex.PositionColored' could be found (are you missing a using directive or an assembly reference?) C:\Users\Akir\documents\visual studio 2010\Projects\Project1\Project1\DirectXWindow.cs 41 22 Project1
Deshalb musste ich sie auskommentieren, danach kann ich das Programm wieder ohne Fehler starten - nur ist das Dreieck weg...
Ich kann also den CustomVertex nicht auf PositionColored umstellen, ohne das Dreieck zu "verlieren"...
-
Wenn du keine vortransformierten Vertices verwendest gibts natürlich kein RHW, das ist schon richtig das dann wegzumachen. Allerdings sind die Koordinaten der Vertices dann auch nichtmehr in Pixeln. Ich vermute du hast einfach die selben Koordinaten verwendet und siehst dann natürlich nichts weil das Dreieck riesengroß ist. Überleg dir mal wo deine Kamera steht, wo sie hinschaut und wo dein Dreieck in der Szene liegt...
-
Ich müsste also mit der Kamera "herauszoomen" und als Camera-Target die Koordinaten einen der Dreieckspunkte angeben?
Ich habe die Größe der Vertices wie folgt nach den Angaben des Tutorials geändert:verts[0].X = 0.0f; verts[0].Y = 1.0f; verts[0].Z = 0.5f; verts[0].Color = Color.Yellow.ToArgb(); verts[1].X = 1.0f; verts[1].Y = 0.0f; verts[1].Z = 0.5f; verts[1].Color = Color.Pink.ToArgb(); verts[2].X = -1.0f; verts[2].Y = 0.0f; verts[2].Z = 0.5f; verts[2].Color = Color.White.ToArgb();
Müsste ich das Dreieck mit folgender LookAt-Methode sehen können?:
device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, -10.0f), new Vector3(0.0f, 0.0f, 0.5f), new Vector3(0.0f, 1.0f, 0.0f));
Entschuldige, wenn ich einen offensichtlichen Fehler mache, aber ich bin noch totaler Anfänger und wollte Direct3D erst einmal "ausprobieren", bevor ich mir teure Fachliteratur anschaffe...
-
Müsstest du, wenn die ProjectionMatrix wie oben ist. Lass die WorldTransform mal weg und schau ob du dann das Dreieck siehst.
-
Tja, habe die WorldTransformation jetzt auskommentiert, sehe das Dreieck aber nach wie vor nicht...
Falls es bei der Beurteilung hilft, hier noch mal der aktuelle Codeusing System; using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Project1 { public class DirectXWindow : System.Windows.Forms.Form { private Device device; private PresentParameters pParameters = new PresentParameters(); private CustomVertex.PositionColored[] verts; private VertexBuffer vertexBuffer; public void InitGraphics() { try { //Display-Einstellungen this.TopMost = true; this.FormBorderStyle = FormBorderStyle.FixedSingle; this.ClientSize = new Size(640, 480); this.Text = "DIRECTXGAME"; pParameters.Windowed = true; pParameters.SwapEffect = SwapEffect.Copy; device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, pParameters); device.RenderState.CullMode = Cull.None; this.KeyPress += new KeyPressEventHandler(this.OnKeyPress); } catch { MessageBox.Show("Fehler beim Initialisieren!"); } //Mit Inhalt füllen verts = new CustomVertex.PositionColored[3]; /*verts[0].X = 130; verts[0].Y = 50; verts[0].Z = 0.5f; // verts[0].Rhw = 1; verts[0].Color = Color.Yellow.ToArgb(); verts[1].X = 250; verts[1].Y = 220; verts[1].Z = 0.5f; // verts[1].Rhw = 1; verts[1].Color = Color.Blue.ToArgb(); verts[2].X = 50; verts[2].Y = 250; verts[2].Z = 0.5f; // verts[2].Rhw = 1; verts[2].Color = Color.Red.ToArgb();*/ verts[0].X = 0.0f; verts[0].Y = 1.0f; verts[0].Z = 0.5f; verts[0].Color = Color.Yellow.ToArgb(); verts[1].X = 1.0f; verts[1].Y = 0.0f; verts[1].Z = 0.5f; verts[1].Color = Color.Pink.ToArgb(); verts[2].X = -1.0f; verts[2].Y = 0.0f; verts[2].Z = 0.5f; verts[2].Color = Color.White.ToArgb(); vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.WriteOnly, CustomVertex.TransformedColored.Format, Pool.Default); GraphicsStream gStream = vertexBuffer.Lock(0, 0, 0); gStream.Write(verts); vertexBuffer.Unlock(); } public void Render() { device.Clear(ClearFlags.Target, Color.Black, 0.0f, 0); device.BeginScene(); //rendering device.VertexFormat = CustomVertex.TransformedColored.Format; device.RenderState.FillMode = FillMode.Solid; int iTime = Environment.TickCount % 1000; float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f; // device.Transform.World = Matrix.RotationY(fAngle); /* Matrix world; world = Matrix.Scaling(1.0f, 1.0f, 1.0f); world *= Matrix.RotationY(1.0f); world *= Matrix.Translation(1.0f, 0.0f, 0.0f); device.Transform.World = world; device.Transform.World = Matrix.Identity;*/ device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, -10.0f), new Vector3(0.0f, 0.0f, 0.5f), new Vector3(0.0f, 1.0f, 0.0f)); device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f); device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 1, verts); device.EndScene(); device.Present(); } public void Exit() { device.Dispose(); } private void OnKeyPress(object sender, KeyPressEventArgs e) { if ((int)e.KeyChar == (int)Keys.Escape) Exit(); this.Close(); } } }
-
Setz mal die WorldMatrix auf die Einheitsmatrix. Und dein Vertexformat stimmt nicht.
-
Die World Matrix ist z.Z. ja Auskommentiert... wie setze ich sie auf "Einheitsmatrix"?
Stimmt, das VertexFormat stimmt nicht... hab ich auf PositionFormat gesetzt, ändert aber noch nichts am Ergebnis... werde erst einmal Einheitsmatrix googlen
-
Vermutlich Matrix.Identity
-
Du meinst, die Zeile
device.Transform.World = Matrix.Identity;
Auch schon versucht...
Ich glaub, ich mache was Grundlegendes falsch
Vielleicht sollte ich mir mal Fachliteratur anschaffen und nochmal von neuem anfangen...
Kennt ihr empfehlenswerte Bücher (weiß aus Erfahrung, dass man viel Geld für Müll ausgeben kann)
Traditionell wird ja in C++ mit Direct3D geschrieben, gibt es also Bücher, für C#?
Wollte für die Frage nicht noch 'nen neuen Thread eröffnen...