Original Post
I am trying to draw simple polygons with Managed DirectX (C#), and get very strange results. Polygons are missing or drawn between other vertices than the ones selected by the index buffer, and it seems to be connected to my PC (Radeon 9700 inside), as it works fine on another computer with a GeForce4.
The following source code shows the problem (on my machine):
It creates a vertex buffer with a grid of 3x3 vertices and defines an index buffer of 2 triangles that shall conneect some of those vertices.
However, it seems like every index i select above 6 will be drawn as if i selected 6...
Has anyone encountered such a problem before and knows how i can possibly solve it?
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace Chapter4Code
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private Device device = null;
private VertexBuffer vb = null;
private IndexBuffer ib = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
//InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
}
/* vertices:
* 0 1 2
* 3 4 5
* 6 7 8
*/
private short[] indices = {
0, 2, 6,
6, 2, 8,
};
/// <summary>
/// We will initialize our graphics device here
/// </summary>
public void InitializeGraphics()
{
// Set our presentation parameters
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
// Create our device
device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams);
vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 9, device, 0, CustomVertex.PositionColored.Format, Pool.Managed);
CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[9];
// Vertices: 3x3 grid of vertices in a plane
verts[0] = new CustomVertex.PositionColored(-1.0f, -1.0f, 0.0f, Color.Green.ToArgb());
verts[1] = new CustomVertex.PositionColored( 0.0f, -1.0f, 0.0f, Color.Red.ToArgb());
verts[2] = new CustomVertex.PositionColored( 1.0f, -1.0f, 0.0f, Color.Yellow.ToArgb());
verts[3] = new CustomVertex.PositionColored(-1.0f, 0.0f, 0.0f, Color.Blue.ToArgb());
verts[4] = new CustomVertex.PositionColored( 0.0f, 0.0f, 0.0f, Color.Purple.ToArgb());
verts[5] = new CustomVertex.PositionColored( 1.0f, 0.0f, 0.0f, Color.Gold.ToArgb());
verts[6] = new CustomVertex.PositionColored(-1.0f, 1.0f, 0.0f, Color.CornflowerBlue.ToArgb());
verts[7] = new CustomVertex.PositionColored( 0.0f, 1.0f, 0.0f, Color.Aqua.ToArgb());
verts[8] = new CustomVertex.PositionColored( 1.0f, 1.0f, 0.0f, Color.White.ToArgb());
vb.SetData(verts, 0, LockFlags.None);
ib = new IndexBuffer(typeof(short), indices.Length, device, 0, Pool.Managed);
ib.SetData( indices, 0, LockFlags.None );
device.RenderState.Lighting = false;
device.RenderState.CullMode = Cull.None;
device.RenderState.FillMode = FillMode.WireFrame;
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 100.0f);
device.Transform.View = Matrix.LookAtLH(new Vector3(0,0, 5.0f), new Vector3(), new Vector3(0,1,0));
device.BeginScene();
device.VertexFormat = CustomVertex.PositionColored.Format;
device.SetStreamSource(0, vb, 0);
device.Indices = ib;
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, indices.Length, 0, indices.Length / 3 );
device.EndScene();
device.Present();
this.Invalidate();
}
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
using (Form1 frm = new Form1())
{
// Show our form and initialize our graphics engine
frm.Show();
frm.InitializeGraphics();
Application.Run(frm);
}
}
}
}