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)

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)


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

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