Двойная прорисовка в DX

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

kanut
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 24.03.2013 (Вс) 12:10

Двойная прорисовка в DX

Сообщение kanut » 24.03.2013 (Вс) 12:40

Пытаюсь отрисовать некоторые фигуры в виде набора треугольников и в виде набора линий, окаймляющих эти треугольники. Делаю схематично так:

Код: Выделить всё
Device.Clear(ClearFlags.Target, System.Drawing.Color.White, 1.0F, 15)
Device.BeginScene()
UstanovkaKameri()

Vershini = CType(VertexBuffer.Lock(0, 0), CustomVertex.PositionColored())

'Здесь заполнение Vershini линиями

Device1.DrawPrimitives(PrimitiveType.LineStrip, 0, Lin)

VertexBuffer.Unlock()

Vershini = CType(VertexBuffer.Lock(0, 0), CustomVertex.PositionColored())

'Здесь заполнение Vershini треугольниками

Device1.DrawPrimitives(PrimitiveType.TriangleList, 0, Lin)

VertexBuffer.Unlock()


Device.EndScene()
Device.Present()


Но этот способ не работает :cry: Пробовал по-всякому располагать эти два вида прорисовок, делал lock - Unlock в разных местах, менял FillMode между Solid и WireFrame, но ничего так и не получилось :?
Возможно ли вообще в DX делать такую двойную прорисовку?

И заодно спрошу, есть ли в DX какая-нибудь функция для получения координат точки в пространстве, полученной проведением перпендикуляра от произвольного объекта к плоскости экрана? Нашел только Project/Unproect, но это не то.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Двойная прорисовка в DX

Сообщение Mikle » 24.03.2013 (Вс) 12:53

Ты постоянно лочишь буфер, и пытаешься рисовать из залоченного буфера. Даже если лочить правильно - это крайне неэффективно, проще рисовать с помощью DrawPrimitivesUp прямо из массивов, но правильнее - создать (заранее, а не в цикле рендера!) один вертексный буфер и два индексных - отдельно для треугольников и линий.
kanut писал(а):функция для получения координат точки в пространстве, полученной проведением перпендикуляра от произвольного объекта к плоскости экрана?

А нет такого объекта, как плоскость экрана. Для начала плоскость нужно определить, а потом проецировать.

kanut
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 24.03.2013 (Вс) 12:10

Re: Двойная прорисовка в DX

Сообщение kanut » 24.03.2013 (Вс) 13:40

DrawPrimitivesUp это DrawUserPrimitives что ли? Помню когда-то я ее хотел использовать, но потом нашел, что она работает медленнее DrawPrimitives, сделал тесты и вовсе отказался от нее.
Я наверно не совсем точно описал проблему, мне нужно отрисовывать треугольники как цветные плоскости, а линии как обводящий "скелет" к этим плоскостям. Переключение между этими режимами, как я понял, происходит с помощью устновки FillMode в Solid или WireFrame (только ли?) соответственно (в примере кода я это забыл указать). Может быть можно устанавливать этот параметр только в начале, при инициализации (Device.SetRenderState(RenderStates.FillMode, FillMode.Solid))? Все мои попытки смены этого параметра при отрисовке окончились неудачно - удавалось рисовать только в одном режиме.

Что-то я нигде не смог найти ничего про работу с плоскостью экрана в мировом пространстве, как ее определяют? Это как-то связано с использованием матрицы проекции и мировой матрицы?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Двойная прорисовка в DX

Сообщение Mikle » 24.03.2013 (Вс) 15:52

kanut писал(а):Что-то я нигде не смог найти ничего про работу с плоскостью экрана в мировом пространстве, как ее определяют?

Никак. Условно плоскостью экрана можно принять любую плоскость, перпендикулярную направлению камеры и ограниченную фрустумом. Эта плоскость может быть даже ближе zNear или дальше zFar.
Пока ты сам не решишь, на каком расстоянии от камеры у тебя будет плоскость экрана, задача не имеет решения, поскольку недостаточно точно определены условия.
kanut писал(а):DrawUserPrimitives что ли? Помню когда-то я ее хотел использовать, но потом нашел, что она работает медленнее DrawPrimitives, сделал тесты и вовсе отказался от нее

Да, это оно, оно медленно, но не медленнее, чем лочить буферы каждый кадр.

kanut
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 24.03.2013 (Вс) 12:10

Re: Двойная прорисовка в DX

Сообщение kanut » 25.03.2013 (Пн) 9:39

Спасибо за помощь, Mikle!

Mikle писал(а):Да, это оно, оно медленно, но не медленнее, чем лочить буферы каждый кадр.


Специально еще раз проверил быстродействие DrawPrimitives и DrawUserPrimitives - получилось DrawPrimitives быстрее DrawUserPrimitives в 2 - 2,5 раза. Заодно, благодаря подсказке про запирание буфера, случайно наткнулся на VertexBuffer.SetData, с помощью которой можно отправлять данные не используя запирание. Кстати, я проверил быстродействие отрисовки DrawPrimitives с запиранием (Lock) и с SetData - оказалось ощутимой разницы нет. Возможно, есть разница на какие-то небольшие проценты, но не в разы.
Самое главное, без Lock у меня сразу получилось обводить треугольники, ставить точки, переключая FillMode.Solid на FillMode.WireFrame и FillMode.Point :D

Буду думать что делать с плоскостью экрана.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Двойная прорисовка в DX

Сообщение Mikle » 25.03.2013 (Пн) 9:56

SetData - это просто надстройка над Lock, memcpy(в менеджед коде там маршаллинг) и UnLock.
kanut писал(а):проверил быстродействие DrawPrimitives и DrawUserPrimitives - получилось DrawPrimitives быстрее DrawUserPrimitives в 2 - 2,5 раза

Да, быстрее, речь была о том, что это нужно выносить из цикла рендера, в цикле рендера оно имеет смысл только тогда, когда данные меняются каждый кадр.
И непонятно, зачем буфер лочится дважды - ведь вертексы треугольников и линий совпадают.

kanut
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 24.03.2013 (Вс) 12:10

Re: Двойная прорисовка в DX

Сообщение kanut » 25.03.2013 (Пн) 12:08

Mikle писал(а):SetData

Главное, что с SetData заработало переключение между видами прорисовки.

Mikle писал(а):Да, быстрее, речь была о том, что это нужно выносить из цикла рендера, в цикле рендера оно имеет смысл только тогда, когда данные меняются каждый кадр.

Угу, переделаю. Я все писал по распространенным примерам из интернета, не особо понимая смысл.

Mikle писал(а):И непонятно, зачем буфер лочится дважды - ведь вертексы треугольников и линий совпадают.

Это я так описал задачу в общем виде. На самом деле иногда они будут разными.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList