forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Советы по оптимизации (http://forum.boolean.name/showthread.php?t=17056)

Mr_F_ 08.11.2012 14:52

Ответ: Советы по оптимизации
 
Цитата:

А у меня какая последняя текстура сюда положится, та и накладывается на все модели.
а как ты её в шейдер передаёшь?

burovalex 08.11.2012 15:41

Ответ: Советы по оптимизации
 
Чтото помучил, вроде заработало. Передавал так:
Код:

Global mesh2=xLoadMesh("./data/mesh/plant/grass1nr.b3d")
tx2=xLoadTexture("./data/mesh/plant/grass1nr.png",4)
xSetEntityEffect mesh2,LODFX
xSetEffectTechnique mesh2,"LODHI"
xSetEffectMatrixSemantic mesh2,"matWVP",WORLDVIEWPROJ
xSetEffectTexture mesh2,"iTEX",tx2
xSetEffectFloat mesh2,"DistHiPoly",7

Текстура то теперь передается, а вот то что она маскированная - шейдеру пофиг

Mr_F_ 08.11.2012 17:28

Ответ: Советы по оптимизации
 
Цитата:

Текстура то теперь передается, а вот то что она маскированная - шейдеру пофиг
маскирование тебе придётся самому в шейдере писать

burovalex 08.11.2012 18:20

Ответ: Советы по оптимизации
 
Я так уже сделал, но думал что есть вариант другой...
Код:

  float4 oTEX = tex2D(TEX_DIFFUSE,TXC);
  clip(DIST<DistLoPoly ? -1:1);
  clip(oTEX.rgb<0.004 ? -1:1);
  return oTEX;

Кстати, проверил xloadtexrute("tex",2), т.е. с альфой шейдер работает без проблем. А когда загружаешь текстуру с флагом маска получается в текстуру альфа не ложится? Это значит ксорсом обрабатываются маски?

И не могу понять, в моем случае условие "oTEX.rgb<0.004" проверяет сумму или умножение r,g и b ??

Mr_F_ 08.11.2012 18:33

Ответ: Советы по оптимизации
 
Цитата:

А когда загружаешь текстуру с флагом маска получается в текстуру альфа не ложится? Это значит ксорсом обрабатываются маски?
тогда ксорс скорее всего создаёт в видеопамяти текстуру без альфаканала.

Цитата:

И не могу понять, в моем случае условие "oTEX.rgb<0.004" проверяет сумму или умножение r,g и b ??
скорее всего это oTEX.rgb < float3(0.004,0.004,0.004) и AND операция всех результатов. ваще даже не думал что оно так скомпилится.

burovalex 08.11.2012 20:35

Ответ: Советы по оптимизации
 
Не понял где надо AND оператор использовать, но пока робит вроде правильно - оставлю )

ВСЁ! У меня чтото получилось. Правда за основу взял не рябь, а сумму ргб, в результате более темные участки исчезают раньше.

Посмотрите плиз пример в аттаче, коментируем по поводу всего!!

И еще раз благодарю всех за помощь, и в особенности Mr_F_!!!

FREE MAN 08.11.2012 21:00

Ответ: Советы по оптимизации
 
Вполне Годный способ! Добавь еще следующие в технику

Код:

AlphaTestEnable  = 1;
 AlphaRef            = 80;
  AlphaFunc            = 5;

что бы не было чёрной обводки на маске

burovalex 08.11.2012 21:06

Ответ: Советы по оптимизации
 
Это прям в шейдер надо писать?

FREE MAN 08.11.2012 21:09

Ответ: Советы по оптимизации
 
Да

burovalex 08.11.2012 21:52

Ответ: Советы по оптимизации
 
Может опять чтото не то сделал, но ничего не изменилось.
Код:

technique LODMNR {
pass P0{
VertexShader = compile vs_2_0 vs_lodmnr();
PixelShader  = compile ps_2_0 ps_lodmnr();
AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
}}

Может это связано с тем, что я не альфой маску создаю, а отбрасываю с рендера (clip)?

FREE MAN 08.11.2012 22:11

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 242955)
Может опять чтото не то сделал, но ничего не изменилось.
Код:

technique LODMNR {
pass P0{
VertexShader = compile vs_2_0 vs_lodmnr();
PixelShader  = compile ps_2_0 ps_lodmnr();
AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
}}

Может это связано с тем, что я не альфой маску создаю, а отбрасываю с рендера (clip)?

Сделай вот так

Код:

technique LODMNR {
pass P0{

AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
AlphaBlendEnable = 0;
CullMode        = NONE;

VertexShader = compile vs_2_0 vs_lodmnr();
PixelShader  = compile ps_2_0 ps_lodmnr();

        }
}


burovalex 08.11.2012 22:25

Ответ: Советы по оптимизации
 
Не помогло (
Дело в том, что я специально контур маски обводил карандашом с цветом (0,0,0)
Т.е. в текстуре нету цвета, к примеру 0,0,1.
Сам не понимаю откуда черная оконтовка берется... Мне кажется что это сам clip такой косяк оставляет

FREE MAN 08.11.2012 22:31

Ответ: Советы по оптимизации
 
Сделай текстуру с альфа каналом

Mr_F_ 08.11.2012 22:33

Ответ: Советы по оптимизации
 
Альфатест это тот же самый clip, альтернативный вариант, разницы нет. Режет по альфе, а тут чувак не возвращает из PS альфа компоненту.
Чтобы не было чёрного контура, достаточно подкрутить число с которым сравниваем в clip - это то же самое.

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

burovalex 08.11.2012 22:45

Ответ: Советы по оптимизации
 
Да да, я именно так и сделал. Пришлось поднять до 0.03 - это примерно 8. Что наверное не есть хорошо, но думаю если маску собираешься использовать, все равно надо текстуру к этому подготавливать.

Может выложить куда-нибудь мой пример, вдруг пригодится.
Только не знаю в какой раздел. То ли в Xors3d, то ли полезные библитеки...

FREE MAN 08.11.2012 23:17

Ответ: Советы по оптимизации
 
доведи до ума пример и сделай небольшой тутор как это всё дело реализовать, и примеры где можно это применять, в Xors3d выкладывай.

burovalex 08.11.2012 23:26

Ответ: Советы по оптимизации
 
А вот еще вопросик появился.
Щас проверял копирует ли ксорс вместе с ентити шейдер. Вроде копирует.

Т.е. можно создавать шаблон, на него накладывать нужные эффекты, потом копировать и у дочки менять только нужные входные параметры??

burovalex 11.11.2012 02:40

Ответ: Советы по оптимизации
 
Чтот потестил я эти ЛОДы и у меня скоро крышняк съедит. Ничего понять не могу!! Может руки у меня из Ж.ПЫ ростут...

Короче у меня вышло что без ЛОДа работает быстрее

Посмотрите пример.

Предупреждаю, архив запакован без папки.

LLI.T.A.L.K.E.R. 11.11.2012 11:29

Ответ: Советы по оптимизации
 
На Blitz3D быстрее без Алгоритма, чем с последним.
как то так

burovalex 11.11.2012 11:37

Ответ: Советы по оптимизации
 
Чушь какая то.. Это ж оптимизация вроде как.....

LLI.T.A.L.K.E.R. 11.11.2012 11:43

Ответ: Советы по оптимизации
 
Но при этом происходит больше перебора и вычислений?

Для Blitz3D намного лучше отобразить когда мало высокополигональных моделей, чем много примитивов.

burovalex 11.11.2012 15:11

Ответ: Советы по оптимизации
 
Ладно, допустим у меня было пивот и на нем прикреплено 3 меша. Если вместо пивота, я буду хранить размер,положение в полях типа. И меш постоянно при смене ЛОД-уровня копировать с шаблона.
Стоит ли такая игра свеч??
Ентити станет вместо 4-х один..

LLI.T.A.L.K.E.R. 11.11.2012 18:30

Ответ: Советы по оптимизации
 
Я тестировал и вроде закреплённые меши - это не один меш.
Если только трианглы копией записывать в один. Но это более нагрузачно.
В общем никак.
Как дела в Xors3D я не знаю.

Mr_F_ 11.11.2012 18:43

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

burovalex 11.11.2012 20:08

Ответ: Советы по оптимизации
 
Mr_F_, у меня не получится массивно, надо по пучкам, т.к. у меня трава сама растет и размножается.
Вот как раз клип у меня всегда висит. Видимо это основной косяк. Но я чтото плохо представляю как на ентити накладывать эффект только в определенных дистанциях. Вопрос даже в том, как это делать, надо както очищать ентити от шейдера?
Цитата:

если ты вообще забьёшь на какую угодно альфу и сделаешь контуры травы полигонами (!), то выиграешь в производительности заметно.
Можно разжевать для одаренных? )) Не уловил мысль, как это сделать контуры травы полигонами?

Mr_F_ 11.11.2012 21:11

Ответ: Советы по оптимизации
 
Цитата:

Но я чтото плохо представляю как на ентити накладывать эффект только в определенных дистанциях. Вопрос даже в том, как это делать, надо както очищать ентити от шейдера?
ээ? берёшь энити - кладёшь шейдер как обычно.

Цитата:

Можно разжевать для одаренных? )) Не уловил мысль, как это сделать контуры травы полигонами?
ну забить вообще на альфу. у тебя же жёсткие контуры у травы. сделай геометрии такую форму, чтоб альфу не надо было юзать.
некоторые оптимизации Z буфера отменяются, если использована альфа в любом виде, включая клип.
траве такие оптимизации пригодятся, потому что у тебя много её перекрывает друг друга.

вообще ты лучше скажи что тебе в финале нужно получить - какой ракурс камеры, какая механика вырастания травы, как много пучков в кадре.

burovalex 13.11.2012 00:30

Ответ: Советы по оптимизации
 
Офигеть, ты мне раскрыл глаза на Z буффер. Это оказывается мощная штука!
На примере травы сделал тест, и оказалось что без альфы производительность возрастает в 3 РАЗА!!
1000 примитихных мешей с альфой скинули фпс до 40, в то время как 3000 таких же без альфы скинули до 45.

Цитата:

вообще ты лучше скажи что тебе в финале нужно получить - какой ракурс камеры, какая механика вырастания травы, как много пучков в кадре.
Я делаю камеру от первого лица, механика примитивная - каждый пучок находится в двухмерном массиве(z,x),меш ростет до нужного значения, затем переходит к размножению, т.е. пытается создать копию в соседнюю ячейку рандомом, после n попыток переходит в пассивный режим(ничего не пытается :) ) , трава и другая растительность будет использоваться в роли ресурсов, для реалистичности планирую использовать где-то от 500-1000 мешей в карде.

Ну траву без альфы я без проблем сделаю, но если надо сделать кустаники и т.п. что без альфы не обойтись.
Цитата:

пригодятся, потому что у тебя много её перекрывает друг друга.
Т.е. чем больше мешей без zбуффера пересекается в проекции камеры тем больше лагов?

Mr_F_ 13.11.2012 01:01

Ответ: Советы по оптимизации
 
Цитата:

Т.е. чем больше мешей без zбуффера пересекается в проекции камеры тем больше лагов?
http://gamedev.stackexchange.com/que...se-depth-testi

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

на твоём месте я бы склеивал в рантайме массивы травы сразу по дофига пучков в цельный меш и не лодил бы никак по сути (точнее просто вырубал видимость их совсем вдалеке). зато так будет один объект/меш/сюрфейс - один вызов отрисовки для видюхи вместо тысячи, это может заметно повлиять на скорость.

burovalex 13.11.2012 01:34

Ответ: Советы по оптимизации
 
Цитата:

я бы склеивал в рантайме массивы травы сразу по дофига пучков в цельный меш
Я об этом думал, но меня завел в тупик тот факт, что мне надо будет взаимодействовать с травой, т.е. мне надо будет её срывать, вот тут я сдулся. Мне кажется это будет слишком сложно для меня, я запутаюсь. Ну допустим я напишу алгоритм, который будет собирать "пассивную" траву 10*10 ячеек в один меш, но иногда она должна становится активной чтобы проверять не появилось ли свободное место и каким то образом удалять отдельный пучок из этого меша (можно конечно заново считать данные с массива и переписать меш 10*10).

Я к чему распинаюсь, у меня карта загружается с обычного рисунка 64х64 пикселя террайном, где 60% поверхности под водой )), и в принципе это для первого уровня должно хватить)
Ну максимум я пока расчитываю карту 256х256, с 70% суши, и 30% растительностью, это примерно 20К мешей, с автофейдом максимум 70-80 будет рендериться допустим 7к мешей. Реально ли обойтись без сложностей?

HolyDel 13.11.2012 02:09

Ответ: Советы по оптимизации
 
а еще в хорсе есть инстансинг!

burovalex 13.11.2012 02:13

Ответ: Советы по оптимизации
 
По пути еще другой вопросик )
Как ты относишься к тому чтобы обрабатывать всё по фреймам - т.е.
frame=frame+1
if frame>10 then frame=1
If (frame mod 10)=1 then
часть операций 1
endif
If (frame mod 10)=2 then
часть операций 2
endif
Если не заметно глазу конечно, ели заметно допустим каждый 2-й 3-й кадр.
Как такой вариант?

burovalex 13.11.2012 02:21

Ответ: Советы по оптимизации
 
Да Holydel, я пробывал его, не почуствовал особого прироста производительности.. Может руки опять же не оттуда )

Mr_F_ 13.11.2012 02:43

Ответ: Советы по оптимизации
 
Цитата:

Если не заметно глазу конечно, ели заметно допустим каждый 2-й 3-й кадр.
Как такой вариант?
хороший вариант.

Цитата:

Да Holydel, я пробывал его, не почуствовал особого прироста производительности.. Может руки опять же не оттуда )
а ты какой пробовал? в старых версиях ксорса был со склеиванием меша и передачей параметров в виде констант в шейдер - но тут уж тебе выгоднее просто склеивать, а в новых они таки добавили хардварный инстансинг (ps 3.0 only), не пробовал его юзать правда, погляди может на форуме ксорса/в списке команд чего)

HolyDel 13.11.2012 02:53

Ответ: Советы по оптимизации
 
Цитата:

Как ты относишься к тому чтобы обрабатывать всё по фреймам - т.е.
кое-кто, совсем недавно, хотел не запутаться :)

burovalex 13.11.2012 13:22

Ответ: Советы по оптимизации
 
Не цепляйся к словам! ))
Не, если честно, должна быть очень полезной такая оптимизация, вот представь, допустим 1000 экземпляром разного типа, с десятком полей, и тебе надо будет не каждый проход их проверять, а например в первый кадр проверил траву, 2-й кадр деревья и т.д.
Посадки фпс по процу точно не будет

burovalex 19.11.2012 00:13

Ответ: Советы по оптимизации
 
Ну, в общем понаступав на пару десятков граблей я пришел к выводу, что в блитце самой большой проблемой является большое количество ентитей. Особенно я это понял когда 300-400 рисованных облачков с альфой начало хавать фпс.
Начал разбираться с синглсёрфом.
с 10000 мешей начал снижаться фпс, и то не из-за рендера, а из-за большого списка.

Сделал перемещение x,y,z, поворот y, а вот поворот х работоет коряво. Если есть у кого рабочий вариант, покажите плиз.
выглядит код так
Код:

Global mesh=xCreateMesh()
Global surf=xCreateSurface(mesh)

Type cloud
        Field x#,y#,z#
        Field surface
        Field vertex[3]
        Field scale#
        Field rotx#,roty#
End Type

Function CloudCreate(x#,y#,z#,scale#,rotx#,roty#)
cloud.cloud=New cloud
        cloud\x=x : cloud\y=y : cloud\z=z
        cloud\scale=scale
        cloud\rotx=rotx : cloud\roty=roty
        cloud\surface=surf
        cloud\vertex[0] = xAddVertex (cloud\surface,cloud\x-cloud\scale*Cos(roty),cloud\y+cloud\scale*Cos(rotx),cloud\z-cloud\scale*Sin(roty-rotx),0,0)
        cloud\vertex[1] = xAddVertex (cloud\surface,cloud\x+cloud\scale*Cos(roty),cloud\y+cloud\scale*Cos(rotx),cloud\z+cloud\scale*Sin(roty+rotx),1,0)
        cloud\vertex[2] = xAddVertex (cloud\surface,cloud\x+cloud\scale*Cos(roty),cloud\y-cloud\scale*Cos(rotx),cloud\z+cloud\scale*Sin(roty-rotx),1,1)
        cloud\vertex[3] = xAddVertex (cloud\surface,cloud\x-cloud\scale*Cos(roty),cloud\y-cloud\scale*Cos(rotx),cloud\z-cloud\scale*Sin(roty+rotx),0,1)
        tr1=xAddTriangle(cloud\surface,cloud\vertex[0],cloud\vertex[1],cloud\vertex[2])
        tr2=xAddTriangle(cloud\surface,cloud\vertex[0],cloud\vertex[2],cloud\vertex[3])
        tr3=xAddTriangle(cloud\surface,cloud\vertex[2],cloud\vertex[1],cloud\vertex[0])
        tr4=xAddTriangle(cloud\surface,cloud\vertex[3],cloud\vertex[2],cloud\vertex[0])
        xLogMessage(cloud\surface)
End Function

Function CloudUpdate(cloud.cloud)
xVertexCoords(cloud\surface,cloud\vertex[0],cloud\x-cloud\scale*Cos(cloud\roty),cloud\y+cloud\scale*Cos(rotx),cloud\z-cloud\scale*Sin(cloud\roty)+cloud\scale*Sin(cloud\rotx))
xVertexCoords(cloud\surface,cloud\vertex[1],cloud\x+cloud\scale*Cos(cloud\roty),cloud\y+cloud\scale*Cos(rotx),cloud\z+cloud\scale*Sin(cloud\roty)+cloud\scale*Sin(cloud\rotx))
xVertexCoords(cloud\surface,cloud\vertex[2],cloud\x+cloud\scale*Cos(cloud\roty),cloud\y-cloud\scale*Cos(rotx),cloud\z+cloud\scale*Sin(cloud\roty)-cloud\scale*Sin(cloud\rotx))
xVertexCoords(cloud\surface,cloud\vertex[3],cloud\x-cloud\scale*Cos(cloud\roty),cloud\y-cloud\scale*Cos(rotx),cloud\z-cloud\scale*Sin(cloud\roty)-cloud\scale*Sin(cloud\rotx))
End Function

Посоветуйте что надо доработать

HolyDel 19.11.2012 19:01

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

burovalex 19.11.2012 22:01

Ответ: Советы по оптимизации
 
Че вы наезжаете?! Здесь сосредоточено 10000 мешиков. У меня на игровом буке фпс было 50 (и то тормозит не из-за рендера, а из-за того что надо пройти по 10к записей за каждый проход), правда в начале пока не сдвинешь камеру лагает сильно, не понятно с чем связано.
Подскажите как поворачивать вертексы по оси Х, у меня в примере должны крутиться, а они только слегка наклоняются

burovalex 20.11.2012 06:08

Ответ: Советы по оптимизации
 
Блин, да суть то не в том как выглядит, а как работает )

HolyDel 20.11.2012 20:03

Ответ: Советы по оптимизации
 
на самом деле нормально работает. шустро.
просто медия слабовата.

а в том примере, где 5 лямов - Эти 5 лямов были лишь со слов автора. Хотя выглядело куда круче, да.

посчитаем:
1 - пропускная скорость шинф PCI-E 16x на процессорах с архитектурой SandyBridge составляет 5GB/s. или
5 368 709 120 бит в секунду. кажется много, но это всего лишь
671 088 640 байт в секунду. На один спрайт нужно два триса. это 6 вершин. на каждую вершину нужно 12 байт на позицию, 8 байт на текстурные координаты. я опустил нормали и цвет, но может они в блице и не используются. хз. итого 120 байт на трис, на 5 000 000 спрайтов нужно соответственно 600 000 000 байт.
итого такая сцена с отправкой каждый кадр всех вершин на гпу по шине будет работать со скоростью чуть более одного фпс. а так-как у автора было значительно быстрее, значит за этими цифрами пряталась какая-лиюо хитрость. Или данные обновлялись не все, или было 5 000 000 травинок по сотне на каждый спрайт, или еще что-то.

HolyDel 21.11.2012 23:15

Ответ: Советы по оптимизации
 
Я тоже ее видел. Я согласен что она выглядит круто.
Я не согласен с приводимыми автором цифрами. Ибо они противоречат теоретическим пределам современного железа.

burovalex 22.11.2012 13:29

Ответ: Советы по оптимизации
 
Ребят, ну помогите с трансформацией, не могу заставить вертексы правильно двигаться. Гуглю, не могу найти нормальынй пример.
Решил уже сделать пивот, выравнивать его относительно новых координат, и все равно коряво работает.
Вот так:
Код:

Function CloudUpdate(cloud.cloud)
xPositionEntity transPivot,cloud\x,cloud\y,cloud\z
xRotateEntity transPivot,cloud\rotx,cloud\roty,0
xTFormPoint(cloud\x,cloud\y,cloud\z,transPivot,0)
xVertexCoords(cloud\surface,cloud\vertex[0],xTFormedX()-1,xTFormedY()+1,xTFormedZ())
xVertexCoords(cloud\surface,cloud\vertex[1],xTFormedX()+1,xTFormedY()+1,xTFormedZ())
xVertexCoords(cloud\surface,cloud\vertex[2],xTFormedX()+1,xTFormedY()-1,xTFormedZ())
xVertexCoords(cloud\surface,cloud\vertex[3],xTFormedX()-1,xTFormedY()-1,xTFormedZ())
End Function

Меняю угол, и у меня начинают квады крутиться как будто я кручу весь меш, и когда угол доходит до 180 они еще и к центру все собираются 0_о
For cloud.cloud=Each cloud
cloud\rotY=cloud\rotY+1
CloudUpdate(cloud.cloud)
Next

burovalex 22.11.2012 21:53

Ответ: Советы по оптимизации
 
У меня есть два треугольника, соединенные в квад. И того 4 вертекса. Мне надо крутить точки вокруг центра квада.
По сути нужно матрицу преобразования поставить в координаты центра квада и повернуть эту матрицу на нужные углы и в нее подставить координаты вертексов.
Но не могу я понять как это сделать ((

burovalex 22.11.2012 23:43

Ответ: Советы по оптимизации
 
Вложений: 1
УРААА!! Получилось! Вот я тугодум, два дня втыкал. Оказывается надо tForm для каждой координаты добавлять.
Мне кажется код нихрена не оптимальный. Ну хотя бы работает )
Код:

Function CloudCreate(x#,y#,z#,scale#=1,rotx#=0,roty#=0,rotz#=0)
cloud.cloud=New cloud
        cloud\x=x : cloud\y=y : cloud\z=z
        cloud\scale=scale
        cloud\rotx=rotx : cloud\roty=roty : cloud\rotz=rotz
        cloud\surface=surf
        xPositionEntity transPivot,cloud\x,cloud\y,cloud\z
        xRotateEntity transPivot,cloud\rotx,cloud\roty,0
        xScaleEntity transPivot,cloud\scale,cloud\scale,cloud\scale
        xTFormPoint(-1,1,0,transPivot,0)
        cloud\vertex[0]=xAddVertex(cloud\surface,xTFormedX(),xTFormedY(),xTFormedZ(),0,0)
        xTFormPoint(1,1,0,transPivot,0)
        cloud\vertex[1]=xAddVertex(cloud\surface,xTFormedX(),xTFormedY(),xTFormedZ(),1,0)
        xTFormPoint(1,-1,0,transPivot,0)
        cloud\vertex[2]=xAddVertex(cloud\surface,xTFormedX(),xTFormedY(),xTFormedZ(),1,1)
        xTFormPoint(-1,-1,0,transPivot,0)
        cloud\vertex[3]=xAddVertex(cloud\surface,xTFormedX(),xTFormedY(),xTFormedZ(),0,1)       
        tr1=xAddTriangle(cloud\surface,cloud\vertex[0],cloud\vertex[1],cloud\vertex[2])
        tr2=xAddTriangle(cloud\surface,cloud\vertex[0],cloud\vertex[2],cloud\vertex[3])
        tr3=xAddTriangle(cloud\surface,cloud\vertex[2],cloud\vertex[1],cloud\vertex[0])
        tr4=xAddTriangle(cloud\surface,cloud\vertex[3],cloud\vertex[2],cloud\vertex[0])
End Function

Function CloudUpdate(cloud.cloud)
xPositionEntity transPivot,cloud\x,cloud\y,cloud\z
xRotateEntity transPivot,cloud\rotx,cloud\roty,cloud\rotz
xTFormPoint(-1,1,0,transPivot,0)
xVertexCoords(cloud\surface,cloud\vertex[0],xTFormedX(),xTFormedY(),xTFormedZ())
xTFormPoint(1,1,0,transPivot,0)
xVertexCoords(cloud\surface,cloud\vertex[1],xTFormedX(),xTFormedY(),xTFormedZ())
xTFormPoint(1,-1,0,transPivot,0)
xVertexCoords(cloud\surface,cloud\vertex[2],xTFormedX(),xTFormedY(),xTFormedZ())
xTFormPoint(-1,-1,0,transPivot,0)
xVertexCoords(cloud\surface,cloud\vertex[3],xTFormedX(),xTFormedY(),xTFormedZ())
End Function

Доделал пример, не окончательный но 70к мешиков вытянул, местами подлагивает..
На качество травы не обращайте внимание, для примера, та же текстура только АльфаРеф накинул)
Качаем, комментируем!!

HolyDel 23.11.2012 00:07

Ответ: Советы по оптимизации
 
работает на 60 фпс-ах.
иногда почемуто опускается до 45-50. Похоже, это происходит когда я пытаюсь все поле окинуть взглядом.

травку на цпу вырвниваешь и шевелишь, или в шейдере?

Nex 23.11.2012 07:09

Ответ: Советы по оптимизации
 
burovalex, я тебе скидывал свой пример где все есть.
HolyDel, думаю на цпу ибо использует TForm.

burovalex 23.11.2012 10:01

Ответ: Советы по оптимизации
 
Цитата:

работает на 60 фпс-ах.
иногда почемуто опускается до 45-50. Похоже, это происходит когда я пытаюсь все поле окинуть взглядом.

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

For rep=1 To 10000
cloud.cloud=First cloud
  CloudUpdate(cloud.cloud)
EndIf
Insert cloud.cloud After Last cloud
Next

Цитата:

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

Nex 23.11.2012 12:44

Ответ: Советы по оптимизации
 
burovalex, хм. Посмотрел код и понял что куда то делся код с разворотом квадов к камере. :)

Mr_F_ 23.11.2012 15:40

Ответ: Советы по оптимизации
 
Цитата:

Обработка с процессора
шейдером будет в 100500 раз быстрее

burovalex 23.11.2012 15:54

Ответ: Советы по оптимизации
 
Я вот чтото даже не могу представить как это делать. Получается шейдер накладывается на Весь меш, а в меше много элементов.
У каждого элемента может быть разные скорости перемещения, поворота, жизни, альфы и тд. Это ж не получится все упихать в шейдер

Mr_F_ 23.11.2012 16:23

Ответ: Советы по оптимизации
 
ну вот для этого и придуман инстансинг.
хотя я не понял, тебе нужно обновлять меш каждый кадр или нет? если не каждый - можно на цпу. если каждый - однозначно в шейдере.

burovalex 23.11.2012 19:20

Ответ: Советы по оптимизации
 
Ну инстансинг вроде как лучше использовать в сложных моделях. Я пробывал простые объекты в инстансинге, результаты не впечатлили. И инстансинг приводит меня к началу, что большое количество ентити тоже ни к чему хорошему не приводит.
Ну пока что я хочу облака реализовать в один меш, их вроде не обязательно каждый кадр обновлять.
Я вообще подумываю о таком варианте. Создать пару тройку мешей на большом расстоянии располагать квады а потом крутить эти меши с разными скоростями.
Как такой вариант?

Mr_F_ 23.11.2012 21:16

Ответ: Советы по оптимизации
 
Цитата:

Ну инстансинг вроде как лучше использовать в сложных моделях. Я пробывал простые объекты в инстансинге, результаты не впечатлили. И инстансинг приводит меня к началу, что большое количество ентити тоже ни к чему хорошему не приводит.
%)
- какой/как ты юзал инстансинг?
- если мы говорим о хардварном инстансинге (sm 3.0), то он лучше работает с простыми объектами (проверено).
- с инстансингом у тебя 1 ентити. вся суть его работы в том чтобы за 1 вызов отрисовки рисовать кучу объектов с индивидуальными свойствами. свойства передаются в доп вертекс буфере (в более ранних инстансингах бывало по-другому типа в виде массива констант - но на константы сильное ограничение в DX).
- не пробывал, а пробовал. это у тебя не опечатка а каждый раз, раздражает)
Цитата:

Ну пока что я хочу облака реализовать в один меш, их вроде не обязательно каждый кадр обновлять.
я хз что такое облака в твоей игре

burovalex 23.11.2012 22:11

Ответ: Советы по оптимизации
 
Цитата:

- какой/как ты юзал инстансинг?
Щас посматрел сам шейдер, а там не инстансинг а херь какая то. Там есть буффер с константами и всё, дальше он никак не используется. Хотя пример с самого ксорса )

Цитата:

- если мы говорим о хардварном инстансинге (sm 3.0), то он лучше работает с простыми объектами (проверено).
Если есть примерчик - буду благодарен! У меня на работе 3Г-модем, 64 кБит сложно в инете лазить...

Цитата:

- не пробывал, а пробовал. это у тебя не опечатка а каждый раз, раздражает)
Спасибо!! Я сам люблю грамотно писать, просто мне никто не говорил :)

Цитата:

я хз что такое облака в твоей игре
Да рисованные от руки, хочу просто по кругу их крутить

Mr_F_ 23.11.2012 22:29

Ответ: Советы по оптимизации
 
Цитата:

Если есть примерчик - буду благодарен! У меня на работе 3Г-модем, 64 кБит сложно в инете лазить...
на ксорсе нету, он там появился, когда я с него ушёл. но по словам Сквида всё на месте. внутри там суть такова:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Цитата:

Да рисованные от руки, хочу просто по кругу их крутить
ну технически не очень представляю чем они являются. массивы спрайтов, одиночные билборды, что-то ещё? скрин?

burovalex 23.11.2012 23:25

Ответ: Советы по оптимизации
 
Вложений: 1
Будешь наверное смеяться над скрином, зато сам :rolleyes:
Квады или билборды, не знаю как правильней )

Код:

Const cloudKindCount=5
Dim cloudMesh(cloudKindCount-1)
Dim cloudSurface(cloudKindCount-1)
Dim cloudTexture(cloudKindCount-1)
For i=0 To cloudKindCount-1
        cloudMesh(i)=xCreateMesh()
        cloudSurface(i)=xCreateSurface(cloudMesh(i))
        cloudTexture(i)=xLoadTexture("./data/sprite/cloud"+(i+1)+".png",4)
        xEntityTexture cloudMesh(i),cloudTexture(i)
        xEntityFX cloudMesh(i),1
        xEntityAlphaRef(cloudMesh(i),80)
Next

Создав несколько мешей, с разными текстурками, затем рандомно к ним добавляю билборды.
А потом кручу меш, и всё крутится вокруг центра - игрока :)

Mr_F_ 23.11.2012 23:49

Ответ: Советы по оптимизации
 
т.е. они всегда одной точкой находятся над головой игрока? такое можно одним мешем сделать. и даже одним сюрфейсом, если все варианты в атлас упаковать.

LLI.T.A.L.K.E.R. 24.11.2012 09:33

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 244543)
УРААА!! Получилось!

Доделал пример, не окончательный но 70к мешиков вытянул, местами подлагивает..
На качество травы не обращайте внимание, для примера, та же текстура только АльфаРеф накинул)
Качаем, комментируем!!

Травка поднимается на уровень камеры, когда пролетаешь над этой травкой.

burovalex 24.11.2012 10:24

Вложений: 1
Цитата:

т.е. они всегда одной точкой находятся над головой игрока? такое можно одним мешем сделать. и даже одним сюрфейсом, если все варианты в атлас упаковать.
Согласен, но я хотел сделать их с разными скоростями, без заморочек самое то )

Цитата:

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

Сделал окончательный для меня вариант. Посмотрите плиз, коменты, советы..
Буду рад любой критике, и простому варианту по рамдомному созданию квадов в меше без их пересечения.
Можно ли использовать MeshIntesect, и долго ли он это проверяет?

Skaner 08.12.2012 21:43

Ответ: Советы по оптимизации
 
MeshIntesect считает долго, хоть и точно.

burovalex 30.12.2012 09:41

Ответ: Советы по оптимизации
 
Начал рисовать лод-уровни для геометрии и столкнулся с такой заморочкой - хотел нарисовать сначала высокополигонный меш, сделать на него текстурную развёртку, а затем удалять точки для менее детализированных мешей. НО когда в 3д максе начал удалять точки и соединять разрывы -текстурная развертка на новые грани уже сбивается (а я думал что текстурные координаты хранятся в вертеках).
Если для каждого лод-уровня заново рисовать развертку и текстуру, то получится довольно кропотливая работа.

Посоветуйте, как можно избежать потери текстурных координат в вертексах, или может прога нужна другая..

burovalex 30.12.2012 22:56

Ответ: Советы по оптимизации
 
Что, никто LOD не реализовал?

Mr_F_ 30.12.2012 23:13

Ответ: Советы по оптимизации
 
гугли слово Ретопология.
в новых максах есть средства для этого, отдельные проги тоже есть.

burovalex 01.01.2013 22:08

Ответ: Советы по оптимизации
 
Нашёл програмульку, называется Topogun 2.
Всё ништяк со штатным примером получается.
Но вот как только начинаешь свой меш тестить, пишет ошибка - Неверная геометрия.
Почитал и понял что косяк в том, что у меня UVS равен нулю. Но не понимаю как этот UVS добавить.


Часовой пояс GMT +4, время: 20:50.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot