Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Первые шаги ManagedDx: прорисовка куба, проблема, странные артефакты 
V
    Опции темы
Crypton
  Дата 7.4.2010, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Короче сел сегодня ночью изучать 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();
        }


--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Crypton
Дата 7.4.2010, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



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

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



Это сообщение отредактировал(а) Crypton - 7.4.2010, 16:30
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0802 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.