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)

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

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


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

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