forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

Reizel 30.10.2011 14:41

Ответ: Странное.
 
Похоже на сосны, но у них текстура в действительности серая. И более вытянутая вверх.

dsd 30.10.2011 15:38

Ответ: Странное.
 
Дались вам эти сосны... Мож это пихты или кедры.

Кстати в чем фэйл несовпадения фототекстуры и геометрии? Я сам чето догнать не могу О_о вроде нормально даже если сильно не совпадает. Че не так должно быть?


Mr_F_ 30.10.2011 15:57

Ответ: Странное.
 
ну на кору это точно не похоже. как скалы - ок.

dsd 30.10.2011 16:11

Ответ: Странное.
 
а так?

NitE 30.10.2011 16:20

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

dsd 30.10.2011 21:49

Ответ: Странное.
 

Просто шум, ососнистая форма и фототекстура. Так лучше?

h1dd3n 30.10.2011 22:09

Ответ: Странное.
 
дак uv то поправь. скейл по вертикали поменьше бы

NitE 30.10.2011 22:10

Ответ: Странное.
 
Растянуто. Тебе нужно тайлить, либо текстуру намного более высокого разрешения.

Reizel 31.10.2011 02:05

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

dsd 31.10.2011 02:44

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

Код:

class tree{
/*
Вот у меня есть этот объект.
Что он должен знать?
Он должен суметь вычислить количество и позицию своих детей, угол поворота и масштаб для каждого ребенка.Знать родителя не должен.
*/
public:
static newgeom branch_mesh;
tree** child;
int number;
float3 pos;
float3 rot;
float3 scale;

//количество детей
int ch_num;
//constructor
tree(float3 p,float3 r,float3 s){
    pos=p;
    rot=r;
    scale=s;
    //это оно узнало, где оно и как в пространстве живет.
    //теперь оно узнает где конец. Сейчас неюгеом настроен на меш длиной 32 юнита
    float length=32;
    //вычислю координаты конца this ветки
    //для этого скопирую меш из меша
    Handle mesh=xCopyMesh(branch_mesh.mesh);
    xPositionEntity(mesh,pos.x,pos.y,pos.z);
    xRotateEntity(mesh,rot.x,rot.y,rot.z);
    xScaleEntity(mesh,scale.x,scale.y,scale.z);
    xTFormPoint(0,length,0,mesh,0);
    //безо всякой математики получилась нужная точка. Хвала разрабам.
    float3 ch_pos(xTFormedX(),xTFormedY(),xTFormedZ());

    //Пусть определится с количеством детей
    ch_num=xRand(2,4);
    //создам данные для детей это будет матрица флоат3 шириной в количество детей высотой в три
    //первая строка позиция,вторая угол, третья масштаб.
    float3 data[3][ch_num];
    //заполню строку позиции
    for(int i=0;i<ch_num;i++){data[0][i]=ch_pos;}
    //теперь надо определиться с поворотом.
    //очевидноБ что первое число отворот от оси родителя, а второе вращение
    //пусть веточки растут через примерно равное кол-во градусов.
    for(int i=0;i<ch_num;i++){data[1][i]=rot+float3(30.0+xRnd(-15,15),360.0*i/ch_num+xRnd(-15,15),0);}
    //пусть считает итоговый скейл детенышей
    for(int i=0;i<ch_num;i++){data[2][i]= scale*float3(0.5,0.5,0.5);}
    //создание детей
    child=new tree*[ch_num];
    for(int i=0;i<ch_num;i++){child[i]=new tree(data[0][i],data[2][i],data[3][i]);}
...
}

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

dsd 31.10.2011 23:43

Ответ: Странное.
 


Не деревья.


Reizel 01.11.2011 03:08

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

dsd 01.11.2011 23:00

Ответ: Странное.
 

Все еще не деревья.

dsd 02.11.2011 00:25

Ответ: Странное.
 
А это правда, что я могу вместо зеленых кубиков шейдером в хорсе отрисовать трехмерную текстуру листвы как-то используя tex3D(s, t)?

Mr_F_ 02.11.2011 00:27

Ответ: Странное.
 
можешь, но вряд ли быстро
делал по этим докам, фпс нехило жрало:
http://graphicsrunner.blogspot.com/2...ering-101.html

Reizel 02.11.2011 11:48

Ответ: Странное.
 
Лучше наверно делать один квад на ветку, который будет с ней сонаправлен. На него навешать тексу листвы.

ПС вот нашел мои исходные деревья на блице
в проге дерево.exe надо нажать пробел для генерации нового дерева и подождать)

dsd 03.11.2011 00:50

Ответ: Странное.
 
Наверно я эстет и сноб, хотя для хорора пойдет только хищно ветками их научить дрыгать. :)

dsd 03.11.2011 17:40

Ответ: Странное.
 


Листва кульная, да?

Mr_F_ 03.11.2011 17:47

Ответ: Странное.
 
прикольно, листва действительно лучше стволов и веток.
откуда кстати текстуру брал?
и какие нормали листве ставил?

dsd 03.11.2011 17:54

Ответ: Странное.
 
Я с cgtextures скачал маскнутое лохматое дерево со стволом, ствол оставил точно по центру. И типо мои кривые ветки втыкаются в нарисованные, все натянул на две плоскости крест накрест, меш с ними выравнивал по такому вектору:
float seedh=xRnd(0,M_PI);
float seedv=xRnd(-0.1*M_PI,0.1*M_PI);

child=new tree*[ch_num];
for(int i=0;i<ch_num;i++){
int genr=generation+1;


float xr=seedh+2*M_PI*i/ch_num+xRnd(-M_PI*0.1,M_PI*0.1);
//y-axis
float yr=seedv+0.25*M_PI+xRnd(-M_PI*0.1,M_PI*0.1);

float3 rt(cos(xr)*cos(yr),cos(yr),sin(xr)*cos(yr));
rt=rt+0.5*r;
здесь r это вектор к которому приалижена ветка предыдущего левла.

Главное чтобы дерево в облачную погоду сфоткано было.

dsd 04.11.2011 00:27

Ответ: Странное.
 

Ничего нового, но даже 100 этих уродцев не тормзят на встроенном видео так, что бы прям фатально, после некоторой оптимизации и пары жертвоприношений, в кадре, наверно, можно будет иметь штук 10-15 симпатишных и даже анимированных мохнатых деревяшек.

moka 04.11.2011 00:33

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

Плюс, нада юзать инстансинг.

dsd 04.11.2011 00:38

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

Randomize 04.11.2011 01:16

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 208225)
Ничего нового, но даже 100 этих уродцев не тормзят на встроенном видео так, что бы прям фатально, после некоторой оптимизации и пары жертвоприношений, в кадре, наверно, можно будет иметь штук 10-15 симпатишных и даже анимированных мохнатых деревяшек.

Wow! Выглядит круто! Много разных деревьев!

dsd 05.11.2011 00:49

Ответ: Странное.
 

Эксперименты с пайнт.нетом.

NitE 05.11.2011 01:26

Ответ: Странное.
 
Листва вообще на уровне, напоминает ролики скайрима:) , но блин, ствол не натуральный совсем.

dsd 05.11.2011 01:30

Ответ: Странное.
 
Ну да, меня пока просто прикололо автоматически фотошопить :) Прям рендеры интерьеров вспоминаются :) Хочу теперь весну и зеркалку...

moka 05.11.2011 01:55

Ответ: Странное.
 
Текстуре бы у ствола вертикальных узоров. Да и цвет ей нормальный. Бампу ещё, и теней на это дело. Будет весьма дельно имхо.

dsd 05.11.2011 02:01

Ответ: Странное.
 
Ну это только через много-много часов программирования. Но с тем как вообще сделать дерево я вроде разобрался :)

Вот с ландшафтом, масштаб дерева истинно эльфийский да и модуль для более симпотного и дешевого текстурирования надо сочинить, но вид уже довольно годный :)


Mr_F_ 05.11.2011 02:15

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

Reizel 05.11.2011 10:17

Ответ: Странное.
 
Нет, он более реалистичен. Ствол шикарен. Продолжай))

dsd 05.11.2011 13:40

Ответ: Странное.
 
Ну так в нем и плейнов раз в двадцать меньше, а при перемещении вокруг него оно дает существенно более трехмерную иллюзию. И это не финальный вариант :)

dsd 08.11.2011 20:52

Ответ: Странное.
 
В общем ай гот а проблем.

В дебаге запускается. В релизе компилится, но падает если запускать из кодеблокс. Если запускать кликая на скомпилином экзешнике, то запускается. Причем такая фигня случается если я создаю меш с меньше чем 64х64 вертексов и после создания гружу текстуру в пнг или ддс.

Код:

Handle MakeMesh(int segments, float size, float radius){
      Handle mesh=xCreateMesh();
      Handle surf=xCreateSurface(mesh);
        //создание плоскости
            for(int i=0;i<=segments;i++){for(int j=0;j<=segments;j++){xAddVertex(surf,i,0,j,(double)i*3/segments,(double)j*3/segments);}}
            int qvert=xCountVertices(surf);
    for(int i=0;i<qvert-segments-1;i++){
        int v0=i;
        int v1=i+1;
        int v2=i+segments+1;
        int v3=v2+1;
            if(v3<qvert && xMod(i,segments+1)!=segments){

                xAddTriangle(surf,v2,v1,v3); xAddTriangle(surf,v2,v0,v1);
                }}
    for(int i=0;i<=segments;i++){for(int j=0;j<=segments;j++){
    int index=i*(segments+1)+j;

    //в 360 градусах 2*m_pi радиан

    double crad=radius*((segments-0.55*i)/segments);
    double disp=3.5*sin(M_PI*i/(double)segments);

    double sn=crad*sin(2*M_PI*j/(double)segments);
    double cs=crad*cos(2*M_PI*j/(double)segments);

    xVertexCoords(surf,index,sn,i*size/segments,cs);
    if(i==segments){xVertexCoords(surf,index,0,i*size/segments,0);}}}
xUpdateN(mesh);
xCalculateFrustumVolume(mesh);
return mesh;
}

Что такого неправильного в выше приведенном коде, что загрузкой текстуры при количестве сегментов 32 или меньше оно падает?

dsd 08.11.2011 23:44

Ответ: Странное.
 

по пробелу ставит сто деревьев. Одно или несколько из них будет висеть в воздухе.

.Squid 08.11.2011 23:57

Ответ: Странное.
 
Тред особо не читал @ сразу отвечал
Че-то число дипов после нескольких нажатий на пробел устремляется к отметке "дофига".
Число полигонов тоже.
При этом качество картинки не очень.
Камеру постоянно тянет назад.
Воду колбасит. Какие параметры near range и far range у камеры?
[правка]
ЗЫ. У меня 2.5М треугольников и 2600 дипов дают 65 фпс. Ну, где-то так и должно быть, но, опять же, зачем столько, если картинку это не красит. 250К треугольников и 2600 дипов дают 65фпс - я в печали. Я надеюсь, что это просто эксперимент, без последующего классического "Фу, Ксорс - говно. Я запилил 100 деревьев и у меня все тормозит."
[/правка]

dsd 09.11.2011 00:02

Ответ: Странное.
 
Это я учусь на свою землю ставить объекты к ней отношения не имеющие.
На одно дерево идет ~40 дипов и 3-4 к треугольников в основном на ствол. В дальнейшем думаю выводить одним дипом 20 деревьев. Воды нет, это просто куб со скейлом 1600,0.1,1600.

У меня есть 36 ближних клеток, на каждую на деревья я собираюсь в светлом будущем тратить на деревья один дип, один на траву .... и т.д.
А еще я хочу опытных рабов :) И вообще я подсел на хорс :)
Да и тормозит то после 1000 деревьев и то помоему больше шейдер земли отжирает ресурсов.

xCameraRange(Camera,0.1,1500);

.Squid 09.11.2011 00:05

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

dsd 13.11.2011 00:26

Ответ: Странное.
 

Вроде ничё текстура камня :)

А зеленая трава должна быть мельче или ок?

+небо

moka 13.11.2011 02:17

Ответ: Странное.
 
Небо и освещение (как цветовое так и в других смыслах) на всём очень не соответсвуют друг другу.
Рябь на текстурах (видно отрубил фильтрацию?) очень сильно рябит, не приятно.
Деревья как натыканные ;)
Плюс, ландшафту нада ещё какую-то более реалестичную природность приобрести, добавить какую-то global detail map или что-то ещё, разнообразить участки текстур, трава с газона у дома, не будет такой в реальных диких условиях, там всё совсем иначе..

Reizel 13.11.2011 12:04

Ответ: Странное.
 
разрисовал отлично, юзал только вектор нормали, или какие-нито карты высот?

dsd 13.11.2011 12:41

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

то Павел: Просто текстуры подобрал посимпатичней, причем из 16 возможных пока используется только 7. А так шейдер тот же по смыслу, только на текстурах удвоенного размера выдает вдвое больший фпс :) Хочу еще на каждом уровне внести какую-нить вариативность самой текстуры как хочет Мока.

dsd 13.11.2011 18:53

Ответ: Странное.
 

Это выглядит разнообразней или просто хуже?

Reizel 13.11.2011 20:11

Ответ: Странное.
 
Это выглядит офигенно!

moka 14.11.2011 15:05

Ответ: Странное.
 
Намного лучше, и разнообразнее.
Про "Detail Map" я имел ввиду эдакая огромного размера текстура (можно как heightmap), имеющая на себе местами затенения, и местами изменения цвета и т.п. Например в болотистых местах, чуток морской волны цвета добавить и т.п.
Накладывать её на результат блендом аналогичным Overlay (в Photoshop), и будет более разнообразное на участках.
Плюс, один ландшафт - этого не достаточно. Нада размещать кучу пропов как в том же Fallout или Skyrim - куски камней, и т.п.
Для этого правад редактор нада, и формат свой, и редактор ландшафта..

А вот по последнему скрину, намного лучше имхо, там хоть больше природного хаоса. Если ещё вот нормал карта, эти каменные штучки, выделяла как более выступающие, и это было бы видно с освещением, было бы вообще супер.

dsd 14.11.2011 17:27

Ответ: Странное.
 
Типо новый шейдер и текстуры. Пробел работает. Фильтрации текстур пока нет, но походу будет :)


Решил все-таки скалы нужно имитировать отдельными мешами.
Так что буду мучить код, авось что-нить и получится.

Мелкий мусор будет к лету, наверно. Зря я на деревья отвлекся.

moka 14.11.2011 18:24

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

dsd 14.11.2011 20:13

Ответ: Странное.
 
Это вообще не маска.

Траву я делю на низкую, среднюю и высокую. В нормальном лесу травы нет, тем более в джунглях, а потоптанная трава это имхо тропа :D. Скальная так вообще :), чем она от обычной на лугу отличается внешним видом? Но ни то ни другое я делать не собираюсь, моя цель несильно уродская, холмистая лесостепь с ручьями. Поэтому двух видов(живая+подсохшая) для стелющейся по земле травы мне достаточно, я наверно вообще больше текстуру усложнять не буду, только тени попробую когда-нить добавить.

moka 14.11.2011 20:29

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 209685)
Это вообще не маска.

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

Цитата:

Сообщение от dsd (Сообщение 209685)
В нормальном лесу травы нет, тем более в джунглях, а потоптанная трава это имхо тропа :D. Скальная так вообще :), чем она от обычной на лугу отличается внешним видом?

Трава и другая растительность в плотном лесу:


Ещё больше травы:



Джунгли:


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

Да и мох тоже, разный есть.

dsd 14.11.2011 20:35

Ответ: Странное.
 
Цитата:

Ты считаешь в реалтайм коэффициенты той или другой текстуры, по нормалям и высоте?
Я считаю:
//кос угла между нормалью и вертикалью
float degcos=dot(norm,float3(0.0f,1.0f,0.0f));
Чем ближе к 1 тем значит горизонтальней поверхность. Плюс разделение по высоте.

Мока, сходи в лес, отойди от опушки вглубь метров на писят хотяб.
И присмотрись внимательней к первой и последней картинкам якобы опровергающим мои слова. А третья это не лес. Лес это когда деревья сверху касаются ветвями.

moka 14.11.2011 20:44

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 209694)
Мока, сходи в лес, отойди от опушки вглубь метров на писят хотяб.

Я вырос в деревне, с дикими лесами вдали от города.
Также в Великобританских (Wales, Scotland, England) и Французских (Север и немного юг) лесах был.

Цитата:

Сообщение от dsd (Сообщение 209694)
И присмотрись внимательней к первой и третей картинкам якобы опровергающим мои слова. А вторая это не лес. Лес это когда деревья сверху касаются ветвями.

Уху, мелкие растения по твоему не являются травой? Ты их никоим образом мешами не сможешь нормально замутить, тебе придётся юзать текстуру с травой, либо будет выглядеть очень голо - текстура с землёй, с редко напичканными кустиками 10-20 сантиметровых пучков травы?

Это всё относиться к траве. И говоря про лесную траву, я имел именно землю с гниющей древесиной и и травой, а не такой как в поле или в парке.

dsd 14.11.2011 20:47

Ответ: Странное.
 
Ок, ты меня победил :) Но в лес сходи все же :D, только поглубже, там трава бывает только ранней весной, пока листва не отрастет.

moka 14.11.2011 20:53

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 209701)
Ок, ты меня победил :) Но в лес сходи все же :D, только поглубже, там трава бывает только ранней весной, пока листва не отрастет.

Ну совсем в глуши, где солнце не пробивается - да. И то не везде, а частями.
Вот в деревне у меня, есть сосновая роща, так там ни травинки радиусом на 300 метров где-то. Т.к. сосны очень высокие, у них даже ниже серидины по высоте веток нету, т.к. там света тоже нет.

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

dsd 14.11.2011 21:20

Ответ: Странное.
 
Цитата:

Сообщение от MoKa (Сообщение 209705)
Но такой лес - специфика. А если у тебя горная поверхность, то там будут и просвети, и полянки, и опушечки, и трава и земля, очень разнообразно будет. :)

Мока, не подскажешь где можно опытных усердных рабов наловить? А?

адрес близарда или бесезды не предлагать :)

moka 14.11.2011 21:51

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 209713)
Мока, не подскажешь где можно опытных усердных рабов наловить? А?

адрес близарда или бесезды не предлагать :)

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

dsd 15.11.2011 01:39

Ответ: Странное.
 

научил это косое месиво прятать швы
я создаю какого-то монстра...


я походу перестал деградировать в кодинге, я терь мутирую :)
PHP код:

void land::sewmesh(){
//фаза первая сшиваю меш ближний со средним.
for(int j=0;j<number;j++){

//***********************************************************************************
    
for(int i=0;i<=resolution-4;i=i+4){
        
float val0=surf->quad[strip[0][j][0][i]]->v00.pos.y;
        
float val1=surf->quad[strip[0][j][0][i+3]]->v01.pos.y;
                
// квад 0
        
surf->quad[strip[0][j][0][i]]->v00.changeheight(val0);
        
surf->quad[strip[0][j][0][i]]->v01.changeheight(0.75*val0+0.25*val1);
                
// квад 1
        
surf->quad[strip[0][j][0][i+1]]->v00.changeheight(0.75*val0+0.25*val1);
        
surf->quad[strip[0][j][0][i+1]]->v01.changeheight(0.5*val0+0.5*val1);
                
// квад 2
        
surf->quad[strip[0][j][0][i+2]]->v00.changeheight(0.5*val0+0.5*val1);
        
surf->quad[strip[0][j][0][i+2]]->v01.changeheight(0.25*val0+0.75*val1);
                
// квад 3
        
surf->quad[strip[0][j][0][i+3]]->v00.changeheight(0.25*val0+0.75*val1);
        
surf->quad[strip[0][j][0][i+3]]->v01.changeheight(val1);
//************************************************************************************
//***********************************************************************************

        
val0=surf->quad[strip[number-1][j][resolution-1][i]]->v10.pos.y;
        
val1=surf->quad[strip[number-1][j][resolution-1][i+3]]->v11.pos.y;
                
// квад 0
        
surf->quad[strip[number-1][j][resolution-1][i]]->v10.changeheight(val0);
        
surf->quad[strip[number-1][j][resolution-1][i]]->v11.changeheight(0.75*val0+0.25*val1);
                
// квад 1
        
surf->quad[strip[number-1][j][resolution-1][i+1]]->v10.changeheight(0.75*val0+0.25*val1);
        
surf->quad[strip[number-1][j][resolution-1][i+1]]->v11.changeheight(0.5*val0+0.5*val1);
                
// квад 2
        
surf->quad[strip[number-1][j][resolution-1][i+2]]->v10.changeheight(0.5*val0+0.5*val1);
        
surf->quad[strip[number-1][j][resolution-1][i+2]]->v11.changeheight(0.25*val0+0.75*val1);
                
// квад 3
        
surf->quad[strip[number-1][j][resolution-1][i+3]]->v10.changeheight(0.25*val0+0.75*val1);
        
surf->quad[strip[number-1][j][resolution-1][i+3]]->v11.changeheight(val1);
//************************************************************************************
//***********************************************************************************

        
val0=surf->quad[strip[j][0][i][0]]->v00.pos.y;
        
val1=surf->quad[strip[j][0][i+3][0]]->v10.pos.y;
                
// квад 0
        
surf->quad[strip[j][0][i][0]]->v00.changeheight(val0);
        
surf->quad[strip[j][0][i][0]]->v10.changeheight(0.75*val0+0.25*val1);
                
// квад 1
        
surf->quad[strip[j][0][i+1][0]]->v00.changeheight(0.75*val0+0.25*val1);
        
surf->quad[strip[j][0][i+1][0]]->v10.changeheight(0.5*val0+0.5*val1);
                
// квад 2
        
surf->quad[strip[j][0][i+2][0]]->v00.changeheight(0.5*val0+0.5*val1);
        
surf->quad[strip[j][0][i+2][0]]->v10.changeheight(0.25*val0+0.75*val1);
                
// квад 3
        
surf->quad[strip[j][0][i+3][0]]->v00.changeheight(0.25*val0+0.75*val1);
        
surf->quad[strip[j][0][i+3][0]]->v10.changeheight(val1);
//************************************************************************************
//***********************************************************************************

        
val0=surf->quad[strip[j][number-1][i][resolution-1]]->v01.pos.y;
        
val1=surf->quad[strip[j][number-1][i+3][resolution-1]]->v11.pos.y;
                
// квад 0
        
surf->quad[strip[j][number-1][i][resolution-1]]->v01.changeheight(val0);
        
surf->quad[strip[j][number-1][i][resolution-1]]->v11.changeheight(0.75*val0+0.25*val1);
                
// квад 1
        
surf->quad[strip[j][number-1][i+1][resolution-1]]->v01.changeheight(0.75*val0+0.25*val1);
        
surf->quad[strip[j][number-1][i+1][resolution-1]]->v11.changeheight(0.5*val0+0.5*val1);
                
// квад 2
        
surf->quad[strip[j][number-1][i+2][resolution-1]]->v01.changeheight(0.5*val0+0.5*val1);
        
surf->quad[strip[j][number-1][i+2][resolution-1]]->v11.changeheight(0.25*val0+0.75*val1);
                
// квад 3
        
surf->quad[strip[j][number-1][i+3][resolution-1]]->v01.changeheight(0.25*val0+0.75*val1);
        
surf->quad[strip[j][number-1][i+3][resolution-1]]->v11.changeheight(val1);
//************************************************************************************

//фаза два выравнивание внутренних точек меша

//внешний ряд
//***********************************************************************************
                // квад 0
        
surf->quad[strip[1][j][0][i]]->v00.changeheight(surf->quad[strip[1][j][0][i]]->v00.pos.y);
        
surf->quad[strip[1][j][0][i]]->v01.changeheight(surf->quad[strip[1][j][0][i]]->v01.pos.y);
                
// квад 1
        
surf->quad[strip[1][j][0][i+1]]->v00.changeheight(surf->quad[strip[1][j][0][i+1]]->v00.pos.y);
        
surf->quad[strip[1][j][0][i+1]]->v01.changeheight(surf->quad[strip[1][j][0][i+1]]->v01.pos.y);
                
// квад 2
        
surf->quad[strip[1][j][0][i+2]]->v00.changeheight(surf->quad[strip[1][j][0][i+2]]->v00.pos.y);
        
surf->quad[strip[1][j][0][i+2]]->v01.changeheight(surf->quad[strip[1][j][0][i+2]]->v01.pos.y);
                
// квад 3
        
surf->quad[strip[1][j][0][i+3]]->v00.changeheight(surf->quad[strip[1][j][0][i+3]]->v00.pos.y);
        
surf->quad[strip[1][j][0][i+3]]->v01.changeheight(surf->quad[strip[1][j][0][i+3]]->v01.pos.y);
//************************************************************************************
//***********************************************************************************

                // квад 0
        
surf->quad[strip[number-2][j][resolution-1][i]]->v10.changeheight(surf->quad[strip[number-2][j][resolution-1][i]]->v10.pos.y);
        
surf->quad[strip[number-2][j][resolution-1][i]]->v11.changeheight(surf->quad[strip[number-2][j][resolution-1][i]]->v11.pos.y);
                
// квад 1
        
surf->quad[strip[number-2][j][resolution-1][i+1]]->v10.changeheight(surf->quad[strip[number-2][j][resolution-1][i+1]]->v10.pos.y);
        
surf->quad[strip[number-2][j][resolution-1][i+1]]->v11.changeheight(surf->quad[strip[number-2][j][resolution-1][i+1]]->v11.pos.y);
                
// квад 2
        
surf->quad[strip[number-2][j][resolution-1][i+2]]->v10.changeheight(surf->quad[strip[number-2][j][resolution-1][i+2]]->v10.pos.y);
        
surf->quad[strip[number-2][j][resolution-1][i+2]]->v11.changeheight(surf->quad[strip[number-2][j][resolution-1][i+2]]->v11.pos.y);
                
// квад 3
        
surf->quad[strip[number-2][j][resolution-1][i+3]]->v10.changeheight(surf->quad[strip[number-2][j][resolution-1][i+3]]->v10.pos.y);
        
surf->quad[strip[number-2][j][resolution-1][i+3]]->v11.changeheight(surf->quad[strip[number-2][j][resolution-1][i+3]]->v11.pos.y);
//************************************************************************************
//***********************************************************************************

                // квад 0
        
surf->quad[strip[j][1][i][0]]->v00.changeheight(surf->quad[strip[j][1][i][0]]->v00.pos.y);
        
surf->quad[strip[j][1][i][0]]->v10.changeheight(surf->quad[strip[j][1][i][0]]->v10.pos.y);
                
// квад 1
        
surf->quad[strip[j][1][i+1][0]]->v00.changeheight(surf->quad[strip[j][1][i+1][0]]->v00.pos.y);
        
surf->quad[strip[j][1][i+1][0]]->v10.changeheight(surf->quad[strip[j][1][i+1][0]]->v10.pos.y);
                
// квад 2
        
surf->quad[strip[j][1][i+2][0]]->v00.changeheight(surf->quad[strip[j][1][i+2][0]]->v00.pos.y);
        
surf->quad[strip[j][1][i+2][0]]->v10.changeheight(surf->quad[strip[j][1][i+2][0]]->v10.pos.y);
                
// квад 3
        
surf->quad[strip[j][1][i+3][0]]->v00.changeheight(surf->quad[strip[j][1][i+3][0]]->v00.pos.y);
        
surf->quad[strip[j][1][i+3][0]]->v10.changeheight(surf->quad[strip[j][1][i+3][0]]->v10.pos.y);
//************************************************************************************
//***********************************************************************************

                // квад 0
        
surf->quad[strip[j][number-2][i][resolution-1]]->v01.changeheight(surf->quad[strip[j][number-2][i][resolution-1]]->v01.pos.y);
        
surf->quad[strip[j][number-2][i][resolution-1]]->v11.changeheight(surf->quad[strip[j][number-2][i][resolution-1]]->v11.pos.y);
                
// квад 1
        
surf->quad[strip[j][number-2][i+1][resolution-1]]->v01.changeheight(surf->quad[strip[j][number-2][i+1][resolution-1]]->v01.pos.y);
        
surf->quad[strip[j][number-2][i+1][resolution-1]]->v11.changeheight(surf->quad[strip[j][number-2][i+1][resolution-1]]->v11.pos.y);
                
// квад 2
        
surf->quad[strip[j][number-2][i+2][resolution-1]]->v01.changeheight(surf->quad[strip[j][number-2][i+2][resolution-1]]->v01.pos.y);
        
surf->quad[strip[j][number-2][i+2][resolution-1]]->v11.changeheight(surf->quad[strip[j][number-2][i+2][resolution-1]]->v11.pos.y);
                
// квад 3
        
surf->quad[strip[j][number-2][i+3][resolution-1]]->v01.changeheight(surf->quad[strip[j][number-2][i+3][resolution-1]]->v01.pos.y);
        
surf->quad[strip[j][number-2][i+3][resolution-1]]->v11.changeheight(surf->quad[strip[j][number-2][i+3][resolution-1]]->v11.pos.y);}
//************************************************************************************
}





Цитата:

Сообщение от MoKa (Сообщение 209714)
Но с качественным редактором, можно посадить хотя бы одного человека, и он будет деревца, камушки и травку рассаживать, и будут все довольны.

А кто будет зарплату платить такому человеку? Ведь без денег работать согласится только полное и бесперспективное чмо, которому тем не менее потребуется рабочее место. Тем более редактор писать. Это не кошерно. Только код и максимум константы в ини файле :)

moka 15.11.2011 14:54

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 209758)
А кто будет зарплату платить такому человеку? Ведь без денег работать согласится только полное и бесперспективное чмо, которому тем не менее потребуется рабочее место. Тем более редактор писать. Это не кошерно. Только код и максимум константы в ини файле :)

Есть такие, и будут сидеть и делать. Главное заинтриговать, и заинтересовать. На том же гд.ру, часто появляются молодые парни, начинающие моделеры, даёшь им редактор, план работ, и он будет пахать. Редактор важно, т.к. им нада это дело в движке наблюдать - это сильно мотивирует.

По поводу кода, что-то снова чувство что это дело можно было хорошенько сократить циклами.

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

dsd 16.11.2011 00:04

Ответ: Странное.
 
Я не верю в голый энтузиазм.

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

С нормалями можно наверно выбирать точку посередине диагонали и смотреть угол между векторами от этой точки к вершинам образующим другую диагональ и выбирать с максимальным. Это довольно легко можно у меня сделать.

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

pozitiffcat 17.11.2011 23:23

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

dsd 18.11.2011 00:31

Ответ: Странное.
 

Перепилил... ммм... ядро. Необъяснимым образом оно стало быстрей и красивей и генерирует теперь более правдоподобную форму О_о.


А че там не понятного то?
Смотри:
Первое я сделал текстуру. В этой текстуре 4 ряда и четыре колонки.
Ряды это текущая местность по высоте, а столбцы отображают деградацию текстуры от уклона, ведь чем больше уклон тем "хуже" выглядит поверхность.

Теперь по самому шейдеру.

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

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

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

pozitiffcat 18.11.2011 00:36

Ответ: Странное.
 
с эти ясно.. как получается отобразить какойто кусок текстуры полностью вот не понятно... ведь если плоскость у которой высота например равна 1, то я хочу рисовать текстуру травы смешивая с текстурой земли... мне получается нужно еще както считать UVW координаты текстуры :4to:

dsd 18.11.2011 00:40

Ответ: Странное.
 
Ну дополнительно нужно и меш в хорсе подготовить. Надо назначить всем точкам окрашиваемого меша текстурные координаты u=worldx v=worldz
В шейдере потом надо найти дробную часть от этих координат и поделить на четыре(по числу моих столбцов) получатся текстурные координаты в пределах лоскутка.

dsd 18.11.2011 17:14

Ответ: Странное.
 

Встроенные тени в хорсе круты неимоверно. Я так понял это теневые объемы. Но блин это не под мое кол-во полигонов. :(

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

И потом как узнать в пиксельном шейдере какому пикселю рендера шадовмапы соответствует текущий пиксель обычного рендера.
Это надо иметь две камеры? и просто в вершинном дополнительно передавать координаты мировые умноженные на матрицу проекции теневой камеры? И это типо будут координаты в текстуры шадомапы.

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

xCreateDSS (1024,1024 ) ;
Handle shadowmap=xCreateTexture(1024,1024,256)

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

Или наложить на все объекты шейдер который в цвет запишет расстояние от света до пикселей?
А?

HolyDel 18.11.2011 17:26

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

Цитата:

Или наложить на все объекты шейдер который в цвет запишет расстояние от света до пикселей?
да. хотя есть специальные depth текстуры. в них можно просто рендерить. хотя ето ближе к ффп.

dsd 20.11.2011 20:19

Ответ: Странное.
 




Решил познавать силу шейдеров на своей машинке пятилетней давности :)


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

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