2010-04-02 2 views
0

Я создаю простое приложение, чтобы ознакомиться с библиотекой SlimDX. Я нашел код, написанный в MDX, и я пытаюсь преобразовать его для запуска на SlimDX. У меня возникают проблемы со светом, потому что все проявляется как черное. Код:SlimDX: проблема молнии с Direct3D9

public partial class DirectTest : Form 
{ 
    private Device device= null; 
    private float angle = 0.0f; 
    Light light = new Light(); 

    public DirectTest() 
    { 
     InitializeComponent(); 

     this.Size = new Size(800, 600); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true); 
    } 
    /// <summary> 
    /// We will initialize our graphics device here 
    /// </summary> 
    public void InitializeGraphics() 
    { 
     PresentParameters pres_params = new PresentParameters() 
     { 
      Windowed = true, 
      SwapEffect = SwapEffect.Discard 
     }; 
     device = new Device(new Direct3D(), 0, DeviceType.Hardware, this.Handle, 
        CreateFlags.SoftwareVertexProcessing, pres_params); 
    } 

    private void SetupCamera() 
    { 
     device.SetRenderState(RenderState.CullMode, Cull.None); 
     device.SetTransform(TransformState.World, Matrix.RotationAxis(new Vector3(angle/((float)Math.PI * 2.0f), 
         angle/((float)Math.PI * 4.0f), angle/((float)Math.PI * 6.0f)), 
         angle/(float)Math.PI)); 
     angle += 0.1f; 
     device.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH((float)Math.PI/
      4, this.Width/this.Height, 1.0f, 100.0f)); 
     device.SetTransform(TransformState.View, Matrix.LookAtLH(new Vector3(0, 0, 5.0f), 
      new Vector3(), new Vector3(0, 1, 0))); 
     device.SetRenderState(RenderState.Lighting, false); 
    } 

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.CornflowerBlue, 1.0f, 0); 
     SetupCamera(); 

     CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3]; 
     verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f); 
     verts[0].Normal = new Vector3(0.0f, 0.0f, -1.0f); 
     verts[0].Color = System.Drawing.Color.White.ToArgb(); 
     verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f); 
     verts[1].Normal = new Vector3(0.0f, 0.0f, -1.0f); 
     verts[1].Color = System.Drawing.Color.White.ToArgb(); 
     verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f); 
     verts[2].Normal = new Vector3(0.0f, 0.0f, -1.0f); 
     verts[2].Color = System.Drawing.Color.White.ToArgb(); 

     light.Type = LightType.Point; 
     light.Position = new Vector3(); 
     light.Diffuse = System.Drawing.Color.White; 
     light.Attenuation0 = 0.2f; 
     light.Range = 10000.0f; 

     device.SetLight(0, light); 
     device.EnableLight(0, true); 

     device.BeginScene(); 

     device.VertexFormat = CustomVertex.PositionColored.format; 
     device.DrawUserPrimitives<CustomVertex.PositionColored>(PrimitiveType.TriangleList, 1, verts); 
     device.EndScene(); 

     device.Present(); 
     this.Invalidate(); 
    } 
} 

}

Формат Vertex, который я использую следующие

[StructLayout(LayoutKind.Sequential)] 
    public struct PositionNormalColored 
    { 
     public Vector3 Position; 
     public int Color; 
     public Vector3 Normal; 
     public static readonly VertexFormat format = VertexFormat.Diffuse | VertexFormat.Position | VertexFormat.Normal; 
    } 

Любые предложения о том, что проблема может быть? Спасибо за внимание

+0

Можем ли мы увидеть код SlimDX? Кажется, это просто MDX –

ответ

1

Почему вы звоните device.SetRenderState(RenderState.Lighting, false)? Я не вижу, где вы снова включаете освещение.

0

Нормальное должно быть вторым значением в структуре (а не третьим), но кроме этого я не могу работать ни в моем текущем проекте (порт из TAO openGL, где освещение отлично работало).

Смежные вопросы