using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace DXtriangle3DLight
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
}
private Device device = null;
float angle = 0;
public void InitializeGraphics()
{
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true; //приложение оконное
presentParams.SwapEffect = SwapEffect.Discard; //видеокарта сама определяет режим работы с буфером
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
device.DeviceResizing+=new CancelEventHandler(this.CanselResize);
}
private void CanselResize(object sender, CancelEventArgs e)
{
//e.Cancel = true;
}
private void SetupCamera()
{
device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, (float)this.Width / this.Height, 1f, 100f);
device.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, 5), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
//device.RenderState.Lighting = false;
device.RenderState.CullMode = Cull.None;
device.RenderState.NormalizeNormals = true;
device.Transform.World = Matrix.RotationAxis(new Vector3(angle / ((float)Math.PI * 2), angle / ((float)Math.PI * 4), angle / ((float)Math.PI * 6)), angle / (float)Math.PI);
angle += 0.1f;
}
private void SetupLights()
{
device.Lights[0].Type = LightType.Point;
device.Lights[0].Position = new Vector3(0, 0, 0);
device.Lights[0].Diffuse = Color.White;
device.Lights[0].Attenuation0 = 0.2f;
device.Lights[0].Range = 10000f;
device.Lights[0].Enabled = true;
}
private CustomVertex.PositionNormalColored[] TriangleN()
{
CustomVertex.PositionNormalColored[] verts = new CustomVertex.PositionNormalColored[3];
verts[0].Position = new Vector3(0f, 1f, 1f);
verts[0].Normal = new Vector3(0f, 0f, -1f);
verts[0].Color = Color.Orange.ToArgb();
verts[1].Position = new Vector3(-1f, -1f, 1f);
verts[1].Normal = new Vector3(0f, 0f, -1f);
verts[1].Color = Color.Purple.ToArgb();
verts[2].Position = new Vector3(1f, -1f, 1f);
verts[2].Normal = new Vector3(0f, 0f, -1f);
verts[2].Color = Color.Green.ToArgb();
return verts;
}
protected override void OnPaint(PaintEventArgs e)
{
device.Clear(ClearFlags.Target, Color.CadetBlue, 1f, 0);
SetupCamera();
SetupLights();
device.BeginScene();
device.VertexFormat = CustomVertex.PositionNormalColored.Format;
device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, TriangleN());
device.EndScene();
device.Present();
this.Invalidate();
}
}
}
Исчезновение освещения
Начав изучать DirectX столкнулся с такой проблемой - если используется освещение, то оно исчезает при изменении размеров окна и больше не восстанавливается, предотвратить это можно отменой события DeviceResizing, что отрицательно сказывается на качестве картинки. Как это исправить?
Сам код:
Код: