Вот есть программа на C# для Managed DirectX
| Код | using System; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; using DirectInput = Microsoft.DirectX.DirectInput;
namespace Test3D { public class MainForm : Form { Device device; Mesh mesh; Sprite sprite; Font font; Material material; Viewport viewport1, viewport2; Matrix matrix1, matrix2; int fps = 0; string sfps = ""; Timer timer; DirectInput.Device mouse;
int mx = 0, my = 0;
public static void Main() { MainForm form = new MainForm(); form.Show(); while (form.Created) { form.Render(); Application.DoEvents(); } }
public MainForm() { Text = "Test3D"; Width = 640; Height = 480;
timer = new Timer(); timer.Interval = 1000; timer.Enabled = true; timer.Tick += new EventHandler(timer_Tick);
PresentParameters parms = new PresentParameters(); parms.Windowed = true; parms.SwapEffect = SwapEffect.Discard; parms.EnableAutoDepthStencil = true; parms.AutoDepthStencilFormat = DepthFormat.D16; parms.PresentationInterval = PresentInterval.Immediate;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, parms);
sprite = new Sprite(device); font = new Font(device, new System.Drawing.Font("Arial Black", 20.0f));
mesh = Mesh.Teapot(device);
material = new Material(); material.Diffuse = System.Drawing.Color.White; device.Material = material;
viewport1 = new Viewport(); viewport1.Width = 150; viewport1.Height = 150;
viewport2 = device.Viewport; device.Viewport = viewport1;
matrix1 = new Matrix(); matrix1.Scale(0.7f, 0.7f, 0.7f); matrix1.Translate(0f, 0f, 5f);
DirectInput.DeviceList inputDevices = (DirectInput.DeviceList)DirectInput.Manager.GetDevices(DirectInput.DeviceClass.Pointer, Microsoft.DirectX.DirectInput.EnumDevicesFlags.AllDevices); inputDevices.MoveNext(); mouse = new Microsoft.DirectX.DirectInput.Device(((DirectInput.DeviceInstance)inputDevices.Current).InstanceGuid); mouse.Acquire(); }
void timer_Tick(object sender, EventArgs e) { sfps = fps.ToString(); fps = 0; }
public void Render() { device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.DarkBlue, 100.0f, 0); device.RenderState.ZBufferEnable = true; device.RenderState.ZBufferWriteEnable = true; device.RenderState.Clipping = false; device.BeginScene();
device.RenderState.Lighting = true; device.Lights[0].Type = LightType.Directional; device.Lights[0].Direction = new Vector3(7, -2, 1); device.Lights[0].Diffuse = System.Drawing.Color.Yellow; device.Lights[0].Enabled = true; device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f);
device.Viewport = viewport1; device.Transform.View = matrix1;
mesh.DrawSubset(0);
device.Viewport = viewport2;
matrix2 = new Matrix(); matrix2.Scale(0.7f, 0.7f, 0.7f); matrix2.RotateY(mx / 300.0f); matrix2.M43 = 5f; device.Transform.View = matrix2;
mesh.DrawSubset(0);
sprite.Begin(SpriteFlags.AlphaBlend); font.DrawText(sprite, string.Format("fps={0}, angle={1}", sfps, (mx / 300.0f).ToString("0.00")), 0, 0, System.Drawing.Color.White); DirectInput.MouseState mstate = mouse.CurrentMouseState; mx += mstate.X; my += mstate.Y; sprite.End();
device.EndScene(); device.Present();
fps++; } } }
|
Код тестовый, поэтому не оптимизирован. При изменении размеров окна пропадает освещение. Почему? |