Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Почему-то не отрисовывается трехугольник :(


Автор: it_medved 28.6.2008, 14:39
Вот код
Код

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            CustomVertex.TransformedColored[] n = new CustomVertex.TransformedColored[3];

            Rectangle rc = this.ClientRectangle;

            n[0].Position = new Vector4(rc.Width/2.0F, 50.0F, 0.5F, 1.0F);
            n[0].Color = System.Drawing.Color.Green.ToArgb();

            n[1].Position = new Vector4((rc.Width - (rc.Width / 5)), (rc.Height - (rc.Height / 5)), 0.5F, 1.0F);
            n[1].Color = System.Drawing.Color.Red.ToArgb();

            n[2].Position = new Vector4(rc.Width / 5, (rc.Height - (rc.Height / 5)), 0.5F, 1.0F);
            n[2].Color = System.Drawing.Color.Blue.ToArgb();

            dev.BeginScene();

            dev.VertexFormat = CustomVertex.TransformedColored.Format;
            dev.DrawUserPrimitives(PrimitiveType.TriangleList, 3, n);
            dev.EndScene();
        }


И ничего не происходит :(


Автор: kuller 28.6.2008, 15:47
it_medved, тебе просто ТРЕУГОЛЬНИК надо нарисовать??? 

Автор: DimonSE 29.6.2008, 18:20
Пример случайно не с книги "Миллер Т. - DirectX 9 с управляемым кодом. Программирование игр и графика"?  smile 

Я такой точно пример видел в отсканированной халявной версии книжки. Пока понял что там скорее всего ошибка(или просто неудачно отсканированное)

dev.DrawUserPrimitives(PrimitiveType.TriangleList, 3, n); второй параметр (цифра 3) означает что у тебя три треугольника, а ведь у тебя только один правда?

кроме того перед dev.BeginScene(); желательно вызвать dev.Clear(ClearFlags.Target, System.Drawing.Color.<твой цвет фона>, 1.0f, 0);

а после dev.EndScene(); нужно dev.Present() для того чтоб твое творение появилось))))
ну и при изменении размеров окна будут у тебя глюки, устраняется так:
после dev.Present() нужно еще dev.Invalidate();а чтоб не мерцало то в конструкторе вписать строку this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
Да ты только метод Paint нам показал а инициализацию dev почему нет в примере, может и там замутил чтото?

Ой чтото много переделать нада)) пожалуй я выложу твой код в рабочем состоянии

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace TestVertex
{
    public partial class Form1 : Form
    {
        Device dev = null;
        public Form1()
        {
            InitializeComponent();
            PresentParameters pr = new PresentParameters();
            pr.Windowed = true;
            pr.SwapEffect = SwapEffect.Discard;
            //создаем устройство через которое работаем с 3D
            dev = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, pr);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true); //чтоб форма не мерцала
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            dev.Clear(ClearFlags.Target, Color.LightGreen, 1.0f, 0);
            //твой кусок кода :)
            CustomVertex.TransformedColored[] n = new CustomVertex.TransformedColored[3];
            Rectangle rc = this.ClientRectangle;
            n[0].SetPosition(new Vector4(rc.Width / 2.0F, 50.0F, 0.5F, 1.0F));
            n[0].Color = System.Drawing.Color.Green.ToArgb();
            n[1].SetPosition(new Vector4((rc.Width - (rc.Width / 5)), (rc.Height - (rc.Height / 5)), 0.5F, 1.0F));
            n[1].Color = System.Drawing.Color.Red.ToArgb();
            n[2].SetPosition(new Vector4(rc.Width / 5, (rc.Height - (rc.Height / 5)), 0.5F, 1.0F));
            n[2].Color = System.Drawing.Color.Blue.ToArgb();
            dev.BeginScene();
            dev.VertexFormat = CustomVertex.TransformedColored.Format;
            dev.DrawUserPrimitives(PrimitiveType.TriangleList, 1, n); // здесь второй параметр 1 а не 3!
            dev.EndScene();

            dev.Present(); //покажись великий треугольник)))

            Invalidate(); //не забываем!
        }
    }
}


Добавлено через 8 минут и 8 секунд
Кстати книга "Миллер Т. - DirectX 9 с управляемым кодом. Программирование игр и графика" классная!

А то что в отсканированной версии ошибок много, заставляет действительно вникнуть в то что написано,а не тупо драть с примера как я иногда в силу природной лени делаю smile

сорри за оффтоп

Автор: it_medved 29.6.2008, 19:21
Спасиб, функция dev.Present(); помогла, трехугольник отрисовывается, но на фоне хрень какаето происходит :(

Вот проект там экзешник, посмотри сам

Автор: DimonSE 11.7.2008, 23:47
Э брат ты в обработчике Paint забыл вначале сделать dev.Clear(ClearFlags.Target, Color.LightGreen, 1.0f, 0);
поэтому у тебя фон и не очищен!

А вообще твой код у меня не откомполился даже, наверно DirectX SDK у меня другой.
вместо строки n[0].Position = new Vector4(тра-ля-ля);
нужно n[0].SetPosition(new Vector4(тра-ля-ля);

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