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 20.07.2012 22:32

Советы по оптимизации
 
Приветствую товарищи!
Хочу оптимизировать проект, для чего нужно динамически изменять детализацию мешей от расстояния.
Как замечал в игрушках, довольно полезная штука. Вот только организация сие оптимизации мне не очень ясна.

Эт что, надо каждый цикл проверять расстояние со всеми объектами и если оно меньше "n" то удалить старый low-меш и загрузить high-меш??
Наверное я не правильно думаю, а если объектов 1000 и каждый цикл (ну даже через цикл 2 3) проверять расстояние между Всеми объектами это вроде ресурсоемко получается?! :rolleyes:

HolyDel 20.07.2012 22:37

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

Nerd 20.07.2012 22:45

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

Сообщение от burovalex (Сообщение 233562)
Эт что, надо каждый цикл проверять расстояние со всеми объектами и если оно меньше "n" то удалить старый low-меш и загрузить high-меш??
Наверное я не правильно думаю, а если объектов 1000 и каждый цикл (ну даже через цикл 2 3) проверять расстояние между Всеми объектами это вроде ресурсоемко получается?! :rolleyes:

Загружать во время исполнения нехорошо - только hide/show.
Иметь 1000 объектов - само по себе ресурсоёмко.
Я бы делал цикл проверки в отдельном потоке с задержкой между итерациями.

burovalex 20.07.2012 23:06

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

Сообщение от HolyDel (Сообщение 233566)
меши загруженны сразу.
ну или по крайней мере несколько лодов +/- текущего, с фоновой подгрузкой ближайших (но это если выеживаться).
и в зависимости от расстояния просто рисуется тот или иной меш.

Ну да, не то написал, сам так не делаю. Сначала загружаю, а потом просто копирую.

burovalex 20.07.2012 23:12

Ответ: Советы по оптимизации
 
Значит все-таки проверять расстояние самый оптимальный вариант?
Т.е. надо создать пивот и к нему прикрутить 3 меша?

И что получается если объект делать в 3 ступени получится так?:
if entitydistance(camera,pivot)>100 then
showentity ent1
hideentity ent2
hideentity ent3
endif

Так чтоль?

burovalex 20.07.2012 23:28

Ответ: Советы по оптимизации
 
И еще вопросик, стоит ли заморачиваться с альфой, на определенном расстоянии видны low и high с плавным переходом и далле hideentity, или это уже слишком? )

HolyDel 20.07.2012 23:37

Ответ: Советы по оптимизации
 
хз. надо играться. я думаю будет некрасиво.

Nerd 20.07.2012 23:41

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

Сообщение от burovalex (Сообщение 233588)
И еще вопросик, стоит ли заморачиваться с альфой, на определенном расстоянии видны low и high с плавным переходом и далле hideentity, или это уже слишком? )

Появятся некрасивые артефакты при переходе (из-за пресечения сеток), если расстояние не сильно большое, а оно того не стоит.
В GTA IV, ЕМНИП, модельки плавно менялись только на большом расстоянии, а на среднем только текстуры.
Если нет сильно большого пространства, то не стоит замарачиваться вообще с lod'ом.

burovalex 20.07.2012 23:51

Ответ: Советы по оптимизации
 
Вот спасибо, помогли!
Кстати, не знал что такое lod, тож спс )

Как думаете дупустим на сдщжное здание 3 уровня мешей нормально будет?

burovalex 20.07.2012 23:54

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

Nerd 20.07.2012 23:57

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

Сообщение от burovalex (Сообщение 233592)
И еще, вопрос, у меня есть трава, состоящая из 3-5 плоских двухсторонних мешей с одним сурфейсом.
Стоит ли на расстоянии превращать их в один плоский меш, поворачивающийся к камере?

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

burovalex 21.07.2012 00:14

Ответ: Советы по оптимизации
 
Спасибо за развеивание сомнений! :)

LLI.T.A.L.K.E.R. 21.07.2012 13:08

Ответ: Советы по оптимизации
 
http://forum.boolean.name/showthread...225#post216225
Сектора (ячейки) перед зрением игрока становятся видимыми, остальные остаются скрытыми (ShowEntity | HideEntity).

Кратко дополню (как я предполагал сделать):
Например есть объект дерево. В type. Оно имеет две model и model_low. Когда нужно (вблизи) объект на карте (из того type) воспринимает хорошую model, в дали же отображает некачественную model_low.

burovalex 23.07.2012 23:16

Ответ: Советы по оптимизации
 
Вопрос
Кто-нибудь знает. Есть ли разница в единицах?
Например если я в блитце состряпаю мир в размерах не 1,2,10... а например 100000 размер машины, 1000к размер дома и т.д. и обзор камеры 100000к. Или вообще не важно какие размеры?

HolyDel 23.07.2012 23:19

Ответ: Советы по оптимизации
 
важно. с большими цифрами будут адовы глюки из-за погрешности флоата.

burovalex 29.07.2012 22:51

Ответ: Советы по оптимизации
 
Такой вопросик, ребята, посоветуйте плиз!

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

jimon 29.07.2012 23:00

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

Сообщение от burovalex (Сообщение 234684)
Такой вопросик, ребята, посоветуйте плиз!

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

а что мешает напрямую работать с вертексами ?

burovalex 29.07.2012 23:03

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

burovalex 29.07.2012 23:07

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

Сообщение от jimon (Сообщение 234686)
а что мешает напрямую работать с вертексами ?

Я еще не видел твоего ответа, когда написал )

Ну допустим я это сделаю, но как потом у треугольников менять размер и поворот?
И не будет ли это еще медленнее работать? :-)

Nex 30.07.2012 11:22

Ответ: Советы по оптимизации
 
Вложений: 1
Цитата:

Сообщение от burovalex (Сообщение 234690)
Ну допустим я это сделаю, но как потом у треугольников менять размер и поворот?
И не будет ли это еще медленнее работать? :-)

Когда то делал, но не доделал частицы - Вложение 17249
Создается 12500 частиц. Если их обновлять то фпс 35 где то, а если нет, то фпс 400+.

burovalex 30.07.2012 21:11

Ответ: Советы по оптимизации
 
Офигеть!!
Запустил у себя, показал фпс 35
Подставил в твой пример обычный вариант (на один меш один сурф), вышло фпс 4 :4to:
Вот это разница!!
Дождался пока станет 1000 треугольников в рендере и все равно фпс 18

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

И что ты считаешь недоделанным?

Nex 30.07.2012 21:42

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

И что ты считаешь недоделанным?
Нет сортировки. Если убрать текстуру и раскрасить квады в разные цвета, то в некоторых местах будет жуткая рябь - это если для 2д использовать. А если в 3д как огонь, дым, то в принципе и так пойдет.
Ну и что нибудь еще тоже надо допилить. :)

tormoz 30.07.2012 21:53

Ответ: Советы по оптимизации
 
Ура изобретателям деревянных велосипедов!

http://forum.boolean.name/showthread.php?t=17111

Nex 30.07.2012 22:46

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

Сообщение от tormoz (Сообщение 234798)
Ура изобретателям деревянных велосипедов!

http://forum.boolean.name/showthread.php?t=17111

Искал это когда надо было, но все ссылки уже не работали вот и написал свое.

burovalex 30.07.2012 22:59

Ответ: Советы по оптимизации
 
Спасибо конечно, примеры красивые.
Но это закрытые библиотеки, я честно не умею ими пользоваться. Да и не научишься так ничему, ИМХО.

tormoz 30.07.2012 23:51

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

Сообщение от burovalex (Сообщение 234808)
Спасибо конечно, примеры красивые.
Но это закрытые библиотеки, я честно не умею ими пользоваться. Да и не научишься так ничему, ИМХО.

открыть не проблема.
уметь там нечего - смотри примеры там все ясно

burovalex 01.08.2012 23:56

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

Сообщение от tormoz (Сообщение 234815)
открыть не проблема.
уметь там нечего - смотри примеры там все ясно

Я тебе спасибо нажал, т.е. притенций быть не должно.
Мне и реально понравилось. Но разбираться мне тяжело в таких вещах, и открывать длл я не умею, и честно нет пока нужды.
Пример от Nex'а мне понравился что я в коде сразу разобрался что и к чему, сразу потестил (выше) поставил к каждому мешу свой сурфейс и фпс упал с 35 до 4. - Наглядно, понятно, и поучительно.
Вывод - пишешь функцию на один сюрфейс - и будут тебе супер-спец-эффекты ;)

burovalex 01.08.2012 23:59

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

Сообщение от Nex (Сообщение 234795)
Нет сортировки. Если убрать текстуру и раскрасить квады в разные цвета, то в некоторых местах будет жуткая рябь - это если для 2д использовать. А если в 3д как огонь, дым, то в принципе и так пойдет.
Ну и что нибудь еще тоже надо допилить. :)

Ну если ты будешь использовать 3д объекты в 2д, то 3д смысл не теряет, т.е. можно каждый квад располагать на расстоянии 0.000000000001 и косяк пропадет )

Nex 02.08.2012 01:20

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

Сообщение от burovalex (Сообщение 234972)
т.е. можно каждый квад располагать на расстоянии 0.000000000001 и косяк пропадет )

Угу только надо в правильном порядке расставлять.

burovalex 24.08.2012 14:50

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

burovalex 24.08.2012 17:11

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

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

LLI.T.A.L.K.E.R. 25.08.2012 00:07

Ответ: Советы по оптимизации
 
Смысл иметь аним меш для оптимизации нет, так как (ВРОДЕ) это тоже самое что и разные меши.
anim_mesh=for each mesh

blitz3d оптимизируется, когда полигоны моделей соединяются в один меш (объект).

burovalex 25.08.2012 20:35

Ответ: Советы по оптимизации
 
Хм, расскажу прикол, сделал в блитце повертексно траву, мне надо чтоб она была пучками. Т.е. я создавал билборды с одним центром и поворачивал их.
Потом решил попробывать создать тоже самое в 3д максе, и экспортировал в б3д, после чего фпс поднялось вроде как на 30%.

Цитата:

blitz3d оптимизируется, когда полигоны моделей соединяются в один меш (объект).
Стоит ли у этих билбордов сделать в центре общую точку?

LLI.T.A.L.K.E.R. 26.08.2012 00:27

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

Сообщение от burovalex (Сообщение 237237)
Хм, расскажу прикол, сделал в блитце повертексно траву, мне надо чтоб она была пучками. Т.е. я создавал билборды с одним центром и поворачивал их.
Потом решил попробывать создать тоже самое в 3д максе, и экспортировал в б3д, после чего фпс поднялось вроде как на 30%.


Стоит ли у этих билбордов сделать в центре общую точку?

я думаю так не получится.

это НЕ будет как "много всякого в одном"
а "много, но как будто бы вместе" (в общем блитз не будет обрабатывать их как одно целое)

Делал я разработку SingleMesh (найти не могу, наверное удалил, так как смысла нет в single_meshe).. Думал соединить 100 коробок в один многополигональный меш или как разные entity_коробки.
Так вот если делать игру DeltaForce на Blitz3D - то уж лучше делать много Entity (и делать обработку - LOD, cull и тп) чем один меш, который всегда отображается(обрабатывается куда ни гляди)
разница на мощном ЭВМ была +15фпс в пользу энтитей

burovalex 27.08.2012 22:36

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

        grass\entity=xCreatePivot()
        grass\entityHI=xCopyEntity(grassMesh1hi,grass\entity) : xEntityPickMode grass\entityHI,2 : xHideEntity grass\entityHI
        grass\entityNR=xCopyEntity(grassMesh1nr,grass\entity) : xEntityPickMode grass\entityNR,2
        grass\entityLO=xCopyEntity(grassMesh1lo,grass\entity) : xEntityPickMode grass\entityLO,2 : xHideEntity grass\entityLO
        grass\LODlevel=3
        grass\class=class
        xEntityAutoFade grass\entity,grassAutoFadeDistance,grassAutoFadeDistance
        xPositionEntity grass\entity,x,y,z
        xTurnEntity grass\entity,0,Rand(360),0
        xScaleEntity grass\entity,0,0,0
        grass\scaleMax=Rnd(0.7,1.2)
        grass\gmode=2

так я проверяю траву
Код:

For i=1 To Ceil(grassCount/32.)
        grass.grass=First grass
        GrassLOD(grass.grass)
        Insert grass After Last grass
        EndIf
Next

Function GrassLOD(grass.grass)
If grass\LODLevel=3 Then
        dist#=xEntityDistance(camera,grass\entity)
        If dist<grassLODDistHN And grass\gmode<>3 Then xHideEntity(grass\entityNR) : xShowEntity(grass\entityHI) : grass\gmode=3 : changed=True
        If dist>grassLODDistLN And grass\gmode<>1 Then xHideEntity(grass\entityNR) : xShowEntity(grass\entityLO) : grass\gmode=1 : changed=True
        If dist>grassLODDistHN And dist<grassLODDistLN And grass\gmode<>2 Then xHideEntity(grass\entityHI) : xHideEntity(grass\entityLO) : xShowEntity(grass\entityNR) : grass\gmode=2
EndIf
End Function

Может еще чтото посоветуете по оптимизации?!

burovalex 28.10.2012 23:29

Ответ: Советы по оптимизации
 
Посоветуйте товарищи, как быстрее будет работать.

Сделал LOD таким образом:
Создал type, есть 4 поля, один пивот, к которому лепится 3 модели разного уровня. И в зависимости от расстояния до объекта 2 модели скрываются и нужная отображается. Вроде все неплохо.

А лучше ли будет сделать просто одно поле для ентити, и при смене удалять один объект и загружать другой. Но не loadMesh конечно, copyEntity

SBJoker 28.10.2012 23:30

Ответ: Советы по оптимизации
 
Нет не лучше.

burovalex 28.10.2012 23:56

Ответ: Советы по оптимизации
 
Спасиб!

Еще вопросик. У кого-нибудь есть шейдер для плавного перехода от одной модели к другой??

Видел во многих играх, и смотрится клёво - глаза не режут переходы.
Смотрится так, как будто одна модель исчезает а другая появляется частичками

FREE MAN 29.10.2012 00:58

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

burovalex 29.10.2012 10:28

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

HolyDel 29.10.2012 10:39

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

burovalex 29.10.2012 15:15

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

burovalex 29.10.2012 15:19

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

HolyDel 29.10.2012 17:13

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

burovalex 29.10.2012 21:07

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

А есть шейдер, который скрывает уже не нужный объект кусочками - как будто на объекте маска, и пиксели у нее рандомно исчезают
Если играл в Doom3, мог там такое увидеть, когда трупы начинают исчезать - как будто сгорают

FREE MAN 29.10.2012 21:44

Ответ: Советы по оптимизации
 
burovalex сделай LOD как в STALKERE или Crysis, забудь про всякие пиксели!
Стандартно LOD делается следующим образом делается от 2 до N количество моделей разного
качества(количество полигонов,текстур - если двиг не умеет сам пережимать их и так далее). Если не нравится резкий переход моделей то тут только в помощь либо морф, как уже говорил HolyDel, либо теселяция.

Mr_F_ 29.10.2012 22:32

Ответ: Советы по оптимизации
 
я знаю о чём речь, раньше в играх любили делать по альфе переход из одного лода в другой, но чем сложнее становился рендер и геометрия, тем напряжнее было юзать повсюду альфабленд, поэтому щас много где (мафия2, гта4 итд) делают переход типа ноизом, исчезающий лод исчезает, теряя пиксели постепенно, новый лод появляется, набирая пиксели на экране.
сделать такое просто - имеешь ЧБ текстуру ноиза, проверить можешь её сразу в шопе с помощью image->adjusments->threshold, у тебя должно выйти, чтобы при кручении слайдера картинка переходила из чёрной в белую шумом.
дальше делаешь тот же threshold в шейдере, наподобие
float clipMask = tex2D(noise, IN.TexCoordsForMask).r; // TexCoordsForMask могут быть в скринспейсе полученные из VPOS, могут быть обычные, надо смотреть как лучше
if (clipMask*maskVisibility < clipThreshold) discard;

burovalex 29.10.2012 22:55

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

Я вот подумал, а если на мешу накладывать 2-ю ЧБ текстуру, и блендом смешивать с альфой, и эту ЧБ текстуру рандомно заполнять белым.
Если вариант, то как думаете, по быстродействию с шейдером сильно отличаться будет?

Mr_F_ 30.10.2012 02:45

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

burovalex 31.10.2012 14:23

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

burovalex 02.11.2012 01:19

Ответ: Советы по оптимизации
 
Не работает (

Код:

Global ref=0
Global tmr=0
While Not xKeyHit(1)
xRenderWorld(1,0)
ref=ref+1
xEntityAlphaRef(mesh,ref)
xText 10,10,ref
xFlip
Wend

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

У меня вот вопросик такой родился )
Через шейдер быстрее обрабатываются меши, чем стандартно?
Если да, то что, все меши можно прогонять через него или не вытянет?

Mr_F_ 02.11.2012 01:22

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

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

Цитата:

Через шейдер быстрее обрабатываются меши, чем стандартно?
Если да, то что, все меши можно прогонять через него или не вытянет?
сегодняшние видюхи сделаны для шейдеров, даже если ты будешь пытаться рендерить без них, внутри драйвера это будет симуляция шейдерного рендеринга, т.е. один хрен.

burovalex 02.11.2012 11:46

Ответ: Советы по оптимизации
 
АААааа, теперь понял) Таким методом на каждом объекте будет альфа. А это не есть хорошо, потом артефакты вылазить начнут.

Я всё таки решил попробывать через шейдеры. Даже кое что научился.
Но вот одно не могу понять.
У меня например есть такой код пикс. шейдера:
Код:

float4 tex = tex2D(Texture0, TEXCOORD0);
return tex;

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

return r,g,b,alpha*distance;
И клёво было бы, если можно так
Код:

float3 rgb=...;
float alpha=...;
return rgb,alpha*distance;

:)

Mr_F_ 02.11.2012 13:13

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

float4 tex = tex2D(Texture0, TEXCOORD0);
return tex;
Цитата:

return r,g,b,alpha*distance;
float4 tex = tex2D(Texture0, TEXCOORD0);
return float4(tex.r, tex.g, tex.b, tex.a*distance);

burovalex 02.11.2012 13:43

Ответ: Советы по оптимизации
 
Вот спасибо тебе, Mr_F_!!!
Я вообще тобой поражаюсь. На любой вопрос можешь ответить!

burovalex 03.11.2012 01:01

Ответ: Советы по оптимизации
 
Блин, ничего не могу понять
Короче нашел програмку для написания шейдера, RenderMonkey. Все получалось. А вот щас начал писать как ты предложил, и у меня альфа вообще не меняется на пред. просмотре.
Даже пробывал так написать

return float4(0.5 ,0.5 ,0 , 0);

Цвета меняются, а альфа вообще не шевелится.....

Mr_F_ 03.11.2012 01:37

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

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

burovalex 04.11.2012 12:28

Ответ: Советы по оптимизации
 
Всё понял, кроме функций. Что такое clip discard?

HolyDel 04.11.2012 13:03

Ответ: Советы по оптимизации
 
эти функции применяются в пиксельном шейдере.
clip функция, которая отбрасывает(не рисует) пиксель если ее аргумент меньше нуля.
discard отброасывает пиксель в любом случае

burovalex 05.11.2012 21:59

Ответ: Советы по оптимизации
 
Discart я чтото даже в майкроовской библиотеке не нашел http://msdn.microsoft.com/en-us/library/bb204826

Зато там нашел пример с Clip
И чтото я его немного не понял, т.к. он не полный
Код:

clip( Input.Color.A < 0.1f ? -1:1 );

Я понял что проверяется условие при котором отсеивать пиксель, но не понял что значит " ? -1 : 1 "
Может это означает что при false = -1 , а при true = 1 ?

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

может так?
Код:

return float4 (clip(color.r<20 ? -1:1),color.g,color.b,color.a)

HolyDel 05.11.2012 22:13

Ответ: Советы по оптимизации
 
это оператор вопроса

(expression)?(true expression) : (false expression)

Цитата:

Может это означает что при false = -1 , а при true = 1 ?
да. именно так

Цитата:

return float4 (clip(color.r<20 ? -1:1),color.g,color.b,color.a)
так вроде нельзя.

Код:

clip(color.r<20 ? -1:1);
return float4 (color.r,color.g,color.b,color.a)ж


burovalex 06.11.2012 00:46

Ответ: Советы по оптимизации
 
Вложений: 1
КРУУТААА!!! :compl:
Всё работает!! :ap:
СПАСИБО ВСЕМ ОГРОМНОЕ ЗА ПОМОЩЬ!!!!! :bravo:

оказалось все просто
Vertex shader
Код:

float4x4 matViewProjection;

void vs_main(
  in float4 iPOS : POSITION,
  in float2 iTC : TEXCOORD,
 
  out float4 oPOS : POSITION,
  out float2 oTC : TEXCOORD0,
  out float2 oDIST : TEXCOORD1)  //для дистанции хватит и одного флоата, но не знаю каким типом заменить
 
{
  oPOS = mul(iPOS, matViewProjection );
  oTC = iTC;
  oDIST = oPOS.z;
}

Pixel shader
Код:

sampler TX1;
float4 ps_main(
  float2 TXC : TEXCOORD0,
  float2 DIST : TEXCOORD1
  ) : COLOR0

  float4 TXOUT = tex2D(TX1, TXC);
  clip(DIST<300 ? -1:1);    //почему то дистанция 300 - а по рисунку не скажешь что так много
  return TXOUT;
}


Теперь такой шейдер я хочу наложить на на 3 уровня мешей (low,normal,hi) и должно получится так, что один меш начнет срезаться, а другой на месте среза появляться.
Вот только есть одно но - меш который будет normal, должен исчезать на одной дистанции и появляться на другой.
Можно ли использовать оператор AND?
т.е.
Код:

clip(DIST<300 AND DIST>1000 ? -1:1);
И еще вот такой вопросик, надо ли в блитце дополнительно скрывать ентити, чтобы видяха не обрабатывала уже "вырезанный" меш?

Mr_F_ 06.11.2012 02:06

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

И еще вот такой вопросик, надо ли в блитце дополнительно скрывать ентити, чтобы видяха не обрабатывала уже "вырезанный" меш?
да

Цитата:

clip(DIST<300 AND DIST>1000 ? -1:1);
clip( ((DIST<300) && (DIST>1000)) ? -1:1) )

burovalex 08.11.2012 12:44

Ответ: Советы по оптимизации
 
У меня опять косяк с шейдером. Я думал что сюда:
Код:

texture iTEX;
sampler TEX_DIFFUSE=sampler_state{};

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


Код:

float4x4 matWVP;

const float LODDISTHI;
const float LODDISTLO;

texture iTEX;
sampler TEX_DIFFUSE=sampler_state{};

//===================LOD HIGHT================================
void vs_lodhi(
  in  float4 iPos  : POSITION0,
  in  float3 iTXC  : TEXCOORD0,
  out float4 oPos  : POSITION0,
  out float3 oTXC  : TEXCOORD0,
  out float3 oDIST : TEXCOORD1)
{
  oPos  = mul( iPos, matWVP );
  oTXC  = iTXC;
  oDIST = oPos.z;
}

float4 ps_lodhi(float3 TXC:TEXCOORD0,  float3 DIST: TEXCOORD1) : COLOR0
{
  float4 oTEX = tex2D(TEX_DIFFUSE,TXC);
  clip(DIST<LODDISTHI ? -1:1);
  return oTEX;
}

technique LODHI {pass P0{VertexShader = compile vs_2_0 vs_lodhi(); PixelShader  = compile ps_2_0 ps_lodhi();}}



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

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