Managed Direct X Projection/View
Verfasst: 13.01.2014, 21:29
Hallo ich hoffe hier kennt sich jemand mit managed DirectX aus. ich benutze das jetzt zum ersten Mal und hab nun auch ein paar Sachen auf den Bildschirm gezaubert. Der grundlegende Teil sieht wie folgt aus:
Die Methode render() ist von mir. In ihr wird per device.DrawUserPrimitives mit dem Typ PrimitiveType.TriangleList ein Viereck gezeichnet. Das funktioniert in der linken oberen Ecke problemlos.
Nun aber erstmal eine andere Frage. Egal was ich für die Projection-Matrix einstelle, das Viereck erscheint immer mit der gleichen Größe an der gleichen Stelle. Auch wenn ich die View- oder World-Matrix ändere, ändert sich am Ergebnis absolut gar nichts. Und ich verstehe nicht so recht wieso. Auch wenn ich z.B. farPane und nearPane auf völlig komische Werte setze und die Matrix unendlich etc enthält, wird alles schön angezeigt. Wahrscheinlich mach ich also was falsch bzw. diese Matrizen werden gar nicht verwendet. In Tutorials war das aber angeblich der Fall.
Die zweite Frage (falls diese sich nicht aus dem ersten Problem ergibt) ist folgende: Basierend auf der Fenstergröße (entspricht der Bildschirmauflösug) platziere ich das Viereck in einer der 4 Bildschirmecken.
UpperLeft: X=0, Y=0
UpperRight: X=WindowWidth-RectWidth, Y=0
LowerLeft: X=0, Y=WindowHeight-RectHeight
LowerRight: X=WindowWidth-RectWidth, Y=WindowHeight-RectHeight
Wie gesagt in der oberen linken Ecke ist alles ok. Recht oben ist das Viereck zu weit links, sodass geschätzt 4-10 Pixel rechts noch frei sind. Im Debugger stimmen die Angaben aber auf den Pixel genau bis zum Rand, daher vermute ich hier fast eine falsche Projektion. Am linken unteren Rand ist die Y-Position viel zu groß. Das Viereck verschwindet zu ca 2/3 im Bildschirmrand. Kurioserweise sieht man ab und an mal die korrekte Position für ein paar Millisekunden und dann springt es an die falsche Position und bleibt da.
Bis auf obigen Code gibt es eigentlich nur noch die Methode render():
Die Variablen x und y kommen von woanders aber haben dort immer die Werte (0, 0), (1280-200, 0), (0, 1024-60) oder (1280-200, 1024-60). Das passt also. Und zwar immer. Die Werte ändern sich nie, außer wenn ich sie halt selbst ändere.
Hat jemand eine Idee? Liegt es eventuell an DrawUserPrimitives?
Code: Alles auswählen
device.Clear(ClearFlags.Target, Color.FromArgb(0, 0, 0, 0), 1.0f, 0);
device.RenderState.ZBufferEnable = false;
device.RenderState.Lighting = false;
device.RenderState.CullMode = Cull.None;
device.Transform.Projection = Matrix.OrthoLH(this.Width, this.Height, 0, 1);
device.BeginScene();
render();
device.EndScene();
device.Present();
Nun aber erstmal eine andere Frage. Egal was ich für die Projection-Matrix einstelle, das Viereck erscheint immer mit der gleichen Größe an der gleichen Stelle. Auch wenn ich die View- oder World-Matrix ändere, ändert sich am Ergebnis absolut gar nichts. Und ich verstehe nicht so recht wieso. Auch wenn ich z.B. farPane und nearPane auf völlig komische Werte setze und die Matrix unendlich etc enthält, wird alles schön angezeigt. Wahrscheinlich mach ich also was falsch bzw. diese Matrizen werden gar nicht verwendet. In Tutorials war das aber angeblich der Fall.
Die zweite Frage (falls diese sich nicht aus dem ersten Problem ergibt) ist folgende: Basierend auf der Fenstergröße (entspricht der Bildschirmauflösug) platziere ich das Viereck in einer der 4 Bildschirmecken.
UpperLeft: X=0, Y=0
UpperRight: X=WindowWidth-RectWidth, Y=0
LowerLeft: X=0, Y=WindowHeight-RectHeight
LowerRight: X=WindowWidth-RectWidth, Y=WindowHeight-RectHeight
Wie gesagt in der oberen linken Ecke ist alles ok. Recht oben ist das Viereck zu weit links, sodass geschätzt 4-10 Pixel rechts noch frei sind. Im Debugger stimmen die Angaben aber auf den Pixel genau bis zum Rand, daher vermute ich hier fast eine falsche Projektion. Am linken unteren Rand ist die Y-Position viel zu groß. Das Viereck verschwindet zu ca 2/3 im Bildschirmrand. Kurioserweise sieht man ab und an mal die korrekte Position für ein paar Millisekunden und dann springt es an die falsche Position und bleibt da.
Bis auf obigen Code gibt es eigentlich nur noch die Methode render():
Code: Alles auswählen
private void render()
{
Color color = Color.Red;
Rectangle rect = new Rectangle(x, y, 200, 60);
CustomVertex.TransformedColored[] vertexes = new CustomVertex.TransformedColored[6];
int alpha = (int)(255.0f * (float)(100 - Data.Transparency) * 0.01f);
color = Color.FromArgb(alpha, color);
vertexes[0].Position = new Vector4(rect.Left, rect.Top, 0, 1.0f);
vertexes[0].Color = color.ToArgb();
vertexes[1].Position = new Vector4(rect.Right - 1, rect.Top, 0, 1.0f);
vertexes[1].Color = color.ToArgb();
vertexes[2].Position = new Vector4(rect.Left, rect.Bottom - 1, 0, 1.0f);
vertexes[2].Color = color.ToArgb();
vertexes[3].Position = new Vector4(rect.Left, rect.Bottom - 1, 0, 1.0f);
vertexes[3].Color = color.ToArgb();
vertexes[4].Position = new Vector4(rect.Right - 1, rect.Bottom - 1, 0, 1.0f);
vertexes[4].Color = color.ToArgb();
vertexes[5].Position = new Vector4(rect.Right - 1, rect.Top, 0, 1.0f);
vertexes[5].Color = color.ToArgb();
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawUserPrimitives(PrimitiveType.TriangleList, 2, vertexes);
}
Hat jemand eine Idee? Liegt es eventuell an DrawUserPrimitives?