dahwan Skrevet 15. november 2007 Del Skrevet 15. november 2007 Denne koden renderer en firkant. Men firkanten blir svart, og jeg vet ikke hvorfor. Hvorfor vises ikke lyset? :S using System; using System.Drawing; using System.Windows.Forms; using System.ComponentModel; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; using Microsoft.DirectX.DirectInput; namespace DirectXApp { /// <summary> /// This is the main class of my Direct3D application /// </summary> public class MainClass : Form { /// <summary> /// The game devices /// </summary> Microsoft.DirectX.Direct3D.Device device = null; Microsoft.DirectX.DirectInput.Device mouse = null; /// <summary> /// The game instances /// </summary> Microsoft.DirectX.Direct3D.Font fontGUI; Microsoft.DirectX.Direct3D.Sprite spriteGUI; Material meshMat = new Material(); Mesh mesh; int intMouseX = 0; int intMouseY = 0; int intMouseZ = 0; string stringInitializeCamera = "Camera initialization failed"; string stringInitializeLighting = "Lighting failed"; string stringMultiSampleInfo = "Multisampling: Six samples"; string NewLine = "\r\n"; string stringGameInfoComposited = ""; Vector3 vector3LightPos = new Vector3(0.0f, 2.0f, -1.0f); public MainClass() { this.SetStyle(ControlStyles.Opaque, true); this.ClientSize = new System.Drawing.Size(640, 480); this.Text = "Direct3D Project"; } public bool InitializeCamera() { try { device.Transform.Projection = Matrix.PerspectiveFovLH(1, this.Width / this.Height, 0.1f, 1000.0f); device.Transform.View = Matrix.LookAtLH(new Vector3(0, 3, -3), new Vector3(), new Vector3(0, 1, 0)); return true; } catch { return false; } } public bool InitializeLighting() { try { device.Lights[0].Diffuse = Color.White; device.Lights[0].Attenuation0 = 0.5f; device.Lights[0].Type = LightType.Point; device.Lights[0].Position = vector3LightPos; device.Lights[0].Enabled = true; return true; } catch (Direct3DXException e) { Console.WriteLine(e.Message); } return false; } public bool InitializeGraphics() { try { // Mouse device mouse = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Mouse); mouse.SetCooperativeLevel(this, CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Background); mouse.Acquire(); // Now let's setup the Direct3D stuff PresentParameters presentParams = new PresentParameters(); presentParams.Windowed = true; presentParams.SwapEffect = SwapEffect.Discard; presentParams.BackBufferCount = 1; presentParams.MultiSample = MultiSampleType.SixSamples; // Create the device device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams); // Setup the event handlers for the device device.DeviceLost += new EventHandler(this.InvalidateDeviceObjects); device.DeviceReset += new EventHandler(this.RestoreDeviceObjects); device.Disposing += new EventHandler(this.DeleteDeviceObjects); device.DeviceResizing += new CancelEventHandler(this.EnvironmentResizing); return true; } catch (DirectXException) { return false; } } protected virtual void InvalidateDeviceObjects(object sender, EventArgs e) { } protected virtual void RestoreDeviceObjects(object sender, EventArgs e) { spriteGUI = new Sprite(device); } protected virtual void DeleteDeviceObjects(object sender, EventArgs e) { this.Dispose(true); } protected virtual void EnvironmentResizing(object sender, CancelEventArgs e) { } /// <summary> /// This method moves the scene /// </summary> protected virtual void FrameMove() { } /// <summary> /// This method renders the scene /// </summary> protected virtual void Render() { if (device != null) { if (InitializeCamera()) stringInitializeCamera = "Camera initialized"; if (InitializeLighting()) stringInitializeLighting = "Lights initialized"; meshMat.DiffuseColor = new ColorValue(100, 100, 100); mesh = Mesh.Box(device, 1, 1, 1); device.RenderState.CullMode = Cull.None; device.Material = meshMat; device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0); #region BEGIN SCENE device.BeginScene(); // GUI fontGUI = new Microsoft.DirectX.Direct3D.Font(device, new System.Drawing.Font("courier new", 10)); Rectangle rect = new Rectangle(new Point(10, 10), new Size(this.Width, 100)); fontGUI.DrawText(spriteGUI, stringGameInfoComposited, rect, DrawTextFormat.Left | DrawTextFormat.WordBreak | DrawTextFormat.ExpandTabs, Color.Black); // GUI // DRAW MESH mesh.DrawSubset(0); // DRAW MESH device.EndScene(); #endregion // PRESENT SCENE device.Present(); } } /// <summary> /// Our mainloop /// </summary> public void Run() { // While the form is still valid, render and process messages while (Created) { FrameMove(); Application.DoEvents(); } } protected override void OnPaint(PaintEventArgs e) { MouseState mouse_state = mouse.CurrentMouseState; intMouseX = mouse_state.X; intMouseY = mouse_state.Y; intMouseZ = mouse_state.Z / 4; stringGameInfoComposited = stringInitializeCamera + NewLine + stringInitializeLighting + NewLine + stringMultiSampleInfo + NewLine + "Mouse X:\t" + intMouseX.ToString() + NewLine + "Mouse Y:\t" + intMouseY.ToString() + NewLine + "Mouse Z:\t" + intMouseZ.ToString(); this.Render(); this.Invalidate(); } protected override void OnKeyPress(KeyPressEventArgs e) { base.OnKeyPress(e); if ((int)e.KeyChar == (int)System.Windows.Forms.Keys.Escape) { this.Close(); } } /// <summary> /// The main entry point for the application /// </summary> static void Main() { using (MainClass DXApp = new MainClass()) { if (!DXApp.InitializeGraphics()) { MessageBox.Show("Error while initializing Direct3D"); return; } DXApp.Show(); DXApp.Run(); } } } } Lenke til kommentar
dahwan Skrevet 18. november 2007 Forfatter Del Skrevet 18. november 2007 Hadde virkelig vært litt gøy med hjelp akkurat nå |-) Lenke til kommentar
tresko Skrevet 18. november 2007 Del Skrevet 18. november 2007 Har ikke mulighet til å teste koden, men leste sånn kjapt gjennom. Den ser grei ut sånn umiddelbart. Mange faktorer kan spille inn for belysning av flaten. For det første, hva forventer du å se? En hvit firkant? Det som kan være noen faktorene til at den blir svart er lysparameterene og materialparameterene. Lysposisjon er (0.0f, 2.0f, -1.0f). Havner lyset inni boksen så vil den ikke bli belyst fra utsiden og den vil se svart ut. Men jeg antar at det er linjen Mesh.Box(device, 1, 1, 1); som referer størrelse i x,y,z retning.. Så da burde lyset være utenfor. Uansett skader det ikke å prøve å posisjonere lyset enn annen plass, f.eks (10,10,10) eller noe. Attenuering av lys fra posisjon kan også spille inn, men antar at attenuation0 er konstant leddet og da skulle det være greit. Ser også at du har DiffuseColor = new ColorValue(100, 100, 100); Det skulle gi en gråtone verdi men ved svak belysning så kan boksen bli svart-aktig. Du kan teste med Color.White og se hva som skjer. Lenke til kommentar
dahwan Skrevet 19. november 2007 Forfatter Del Skrevet 19. november 2007 Irriterende, ass. Velger jeg device.RenderState.Lighting = false (så scenen belyses automatisk) blir kuben kritt hvit. Velger jeg device.RenderState.Lighting = true, blir kuben kullsvart. Har tweaket på values men til ingen nytte. Noen forslag? Lenke til kommentar
dahwan Skrevet 22. november 2007 Forfatter Del Skrevet 22. november 2007 Noen forslag? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå