Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Первые шаги ManagedDx: прорисовка куба


Автор: Crypton 7.4.2010, 07:10
Короче сел сегодня ночью изучать Direct X под C#. XNA как то заинтересовала, сунулся -- куча мусора. Хотя может не там смотрел? Может просто не до понял.
Ну и ладно. Короче, стал писать по книжке. В итоге, в рендере выходят странные артефакты. Может кто подскажет в чем косяк?
user posted image
Код

            // загрузка точек
            Verts.Add(new CustomVertex.PositionColored(-1.0f, 1.0f, 1.0f, Color.Red.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, 1.0f, Color.Red.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, 1.0f, Color.Red.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, 1.0f, Color.Red.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, -1.0f, 1.0f, Color.Red.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, 1.0f, Color.Red.ToArgb()));

            Verts.Add(new CustomVertex.PositionColored(-1.0f, 1.0f, -1.0f, Color.Blue.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, -1.0f, Color.Blue.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, -1.0f, Color.Blue.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, -1.0f, Color.Blue.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, -1.0f, Color.Blue.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, -1.0f, -1.0f, Color.Blue.ToArgb()));

            Verts.Add(new CustomVertex.PositionColored(1.0f, -1.0f, -1.0f, Color.Blue.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, 1.0f, 1.0f, Color.Yellow.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, -1.0f, Color.Yellow.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, 1.0f, -1.0f, Color.Yellow.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, 1.0f, 1.0f, Color.Yellow.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, 1.0f, Color.Yellow.ToArgb()));

            Verts.Add(new CustomVertex.PositionColored(1.0f, 1.0f, -1.0f, Color.Yellow.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, 1.0f, Color.Black.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, -1.0f, Color.Black.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, -1.0f, -1.0f, Color.Black.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(-1.0f, -1.0f, 1.0f, Color.Black.ToArgb()));
            Verts.Add(new CustomVertex.PositionColored(1.0f, -1.0f, -1.0f, Color.Black.ToArgb()));

// и т. д.

 void InitializeCamera() {
            videoCard.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4,
         this.Width / this.Height, 1.0f, 100f);
            videoCard.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, 10.0f), new Vector3(), new Vector3(0, 5, 0));
            videoCard.RenderState.CullMode = Cull.None;
        }
        void InitializeBuffers() {
            if (Verts.Count % 3 != 0) return;
            vb = new VertexBuffer(typeof(CustomVertex.PositionColored), Verts.Count, videoCard, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
            vb.SetData(Verts.ToArray(), 0, LockFlags.None);
            vb.Created += new EventHandler(vb_Created);
        }

        void vb_Created(object sender, EventArgs e) {
            if (Verts.Count % 3 != 0) return;
            vb = new VertexBuffer(typeof(CustomVertex.PositionColored), Verts.Count, videoCard, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
            vb.SetData(Verts.ToArray(), 0, LockFlags.None);
        }


        VertexBuffer vb = null;
        List<CustomVertex.PositionColored> Verts = new List<CustomVertex.PositionColored>();

        float angle = 0f;
        private void RenderForm_Paint(object sender, PaintEventArgs e) {
            videoCard.Clear(ClearFlags.Target, Color.SkyBlue, 1f, 0);
            angle += 0.1f;
            videoCard.RenderState.Lighting = false;

            videoCard.Transform.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);

            try {
                videoCard.BeginScene();
                videoCard.VertexFormat = CustomVertex.PositionColored.Format;
                //videoCard.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
                videoCard.SetStreamSource(0, vb, 0);
                videoCard.DrawPrimitives(PrimitiveType.TriangleList, 0, Verts.Count / 3);
                videoCard.EndScene();
                videoCard.Present();
            } catch (DirectXException ex) {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex.ErrorString);
                Console.WriteLine(ex.Message);
            }
            this.Invalidate();
        }


Автор: Crypton 7.4.2010, 07:28
Разобрался: в инициализации видюхи нужно убрать EnableAutoDepthStencil = true
UPD: Можно оставить, но необходимо очищать Z-буфер. 
Код

videoCard.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.SkyBlue, 1f, 0);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)