|
Xors3D Графический движок с поддержкой DirectX9 |
14.11.2011, 20:35
|
#241
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Ты считаешь в реалтайм коэффициенты той или другой текстуры, по нормалям и высоте?
|
Я считаю:
//кос угла между нормалью и вертикалью
float degcos=dot(norm,float3(0.0f,1.0f,0.0f));
Чем ближе к 1 тем значит горизонтальней поверхность. Плюс разделение по высоте.
Мока, сходи в лес, отойди от опушки вглубь метров на писят хотяб.
И присмотрись внимательней к первой и последней картинкам якобы опровергающим мои слова. А третья это не лес. Лес это когда деревья сверху касаются ветвями.
|
(Offline)
|
|
14.11.2011, 20:44
|
#242
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Мока, сходи в лес, отойди от опушки вглубь метров на писят хотяб.
|
Я вырос в деревне, с дикими лесами вдали от города.
Также в Великобританских (Wales, Scotland, England) и Французских (Север и немного юг) лесах был.
Сообщение от dsd
И присмотрись внимательней к первой и третей картинкам якобы опровергающим мои слова. А вторая это не лес. Лес это когда деревья сверху касаются ветвями.
|
Уху, мелкие растения по твоему не являются травой? Ты их никоим образом мешами не сможешь нормально замутить, тебе придётся юзать текстуру с травой, либо будет выглядеть очень голо - текстура с землёй, с редко напичканными кустиками 10-20 сантиметровых пучков травы?
Это всё относиться к траве. И говоря про лесную траву, я имел именно землю с гниющей древесиной и и травой, а не такой как в поле или в парке.
|
(Offline)
|
|
14.11.2011, 20:47
|
#243
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Ок, ты меня победил Но в лес сходи все же :D, только поглубже, там трава бывает только ранней весной, пока листва не отрастет.
|
(Offline)
|
|
14.11.2011, 20:53
|
#244
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Ок, ты меня победил Но в лес сходи все же :D, только поглубже, там трава бывает только ранней весной, пока листва не отрастет.
|
Ну совсем в глуши, где солнце не пробивается - да. И то не везде, а частями.
Вот в деревне у меня, есть сосновая роща, так там ни травинки радиусом на 300 метров где-то. Т.к. сосны очень высокие, у них даже ниже серидины по высоте веток нету, т.к. там света тоже нет.
Но такой лес - специфика. А если у тебя горная поверхность, то там будут и просветы, и полянки, и опушечки, и трава и земля, очень разнообразно будет.
|
(Offline)
|
|
14.11.2011, 21:20
|
#245
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от MoKa
Но такой лес - специфика. А если у тебя горная поверхность, то там будут и просвети, и полянки, и опушечки, и трава и земля, очень разнообразно будет.
|
Мока, не подскажешь где можно опытных усердных рабов наловить? А?
адрес близарда или бесезды не предлагать
|
(Offline)
|
|
14.11.2011, 21:51
|
#246
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Мока, не подскажешь где можно опытных усердных рабов наловить? А?
адрес близарда или бесезды не предлагать
|
А это ты метко подметил. Но с качественным редактором, можно посадить хотя бы одного человека, и он будет деревца, камушки и травку рассаживать, и будут все довольны.
|
(Offline)
|
|
15.11.2011, 01:39
|
#247
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
научил это косое месиво прятать швы
я создаю какого-то монстра...
я походу перестал деградировать в кодинге, я терь мутирую
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
Но с качественным редактором, можно посадить хотя бы одного человека, и он будет деревца, камушки и травку рассаживать, и будут все довольны.
|
А кто будет зарплату платить такому человеку? Ведь без денег работать согласится только полное и бесперспективное чмо, которому тем не менее потребуется рабочее место. Тем более редактор писать. Это не кошерно. Только код и максимум константы в ини файле
|
(Offline)
|
|
15.11.2011, 14:54
|
#248
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
Сообщение от dsd
А кто будет зарплату платить такому человеку? Ведь без денег работать согласится только полное и бесперспективное чмо, которому тем не менее потребуется рабочее место. Тем более редактор писать. Это не кошерно. Только код и максимум константы в ини файле
|
Есть такие, и будут сидеть и делать. Главное заинтриговать, и заинтересовать. На том же гд.ру, часто появляются молодые парни, начинающие моделеры, даёшь им редактор, план работ, и он будет пахать. Редактор важно, т.к. им нада это дело в движке наблюдать - это сильно мотивирует.
По поводу кода, что-то снова чувство что это дело можно было хорошенько сократить циклами.
С нормалями что-то странное. Кстати, если правильно обработать, и определить по какой лучше диагонали сгибать два триангла в кваде, то можно правильно подобрать чтобы этих не красивостей с нормалями не было.
|
(Offline)
|
|
16.11.2011, 00:04
|
#249
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Я не верю в голый энтузиазм.
Я почему то считаю, что один цикл и восемь выполняются разное время, и один выполнится быстрей.
С нормалями можно наверно выбирать точку посередине диагонали и смотреть угол между векторами от этой точки к вершинам образующим другую диагональ и выбирать с максимальным. Это довольно легко можно у меня сделать.
Или еще лучше, смотреть перепад высот между точками на диагоналях и пускать диагональ по максимальному перепаду.
Кстати я пытался нормаль считать по всем точкам вокруг, но разницы от четырех не было, наверно нужно просто циклом сглаживать разницу между нормалями и все станет ок.
|
(Offline)
|
|
17.11.2011, 23:23
|
#250
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
А расскажите теорию такого шейдера, чтобы рисовать на поверхности. Как у dsd. Сам хочу написать
вот скачал я шейдер который написал dsd но нихера в нем не понял. можт есть че почитать на эту тему?
|
(Offline)
|
|
18.11.2011, 00:31
|
#251
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Перепилил... ммм... ядро. Необъяснимым образом оно стало быстрей и красивей и генерирует теперь более правдоподобную форму О_о.
А че там не понятного то?
Смотри:
Первое я сделал текстуру. В этой текстуре 4 ряда и четыре колонки.
Ряды это текущая местность по высоте, а столбцы отображают деградацию текстуры от уклона, ведь чем больше уклон тем "хуже" выглядит поверхность.
Теперь по самому шейдеру.
1. В вертексном дополнительно передается мировой игрек не умноженный ни на че, это тот же игрек что и в хорсе.
2. В пиксельном происходит первичный анализ этой высоты для выбора строки в текстуре. Далее выбранная строка передается в функцию которая анализируя отклонение вектора нормали поверхности от вертикали определяет столбец текстуры.
Это если в кратце.
Но так на границах слоев, как по нормалям так и по высотом наблюдаются очень четкие и уродские швы. То мой шейдер производит смешивание сначала слоев по нормалям, а затем и по высотам.
Если все еще не понятно, то пость кусок моего шейдера, а я детально скажу, что в том куске происходит.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.11.2011, 00:36
|
#252
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
с эти ясно.. как получается отобразить какойто кусок текстуры полностью вот не понятно... ведь если плоскость у которой высота например равна 1, то я хочу рисовать текстуру травы смешивая с текстурой земли... мне получается нужно еще както считать UVW координаты текстуры
|
(Offline)
|
|
18.11.2011, 00:40
|
#253
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Ну дополнительно нужно и меш в хорсе подготовить. Надо назначить всем точкам окрашиваемого меша текстурные координаты u=worldx v=worldz
В шейдере потом надо найти дробную часть от этих координат и поделить на четыре(по числу моих столбцов) получатся текстурные координаты в пределах лоскутка.
|
(Offline)
|
|
18.11.2011, 17:14
|
#254
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Встроенные тени в хорсе круты неимоверно. Я так понял это теневые объемы. Но блин это не под мое кол-во полигонов.
Дайте шейдер под хорс который шадомапу строит.
Даже точней разъясните мне как я могу в текстуру записать буфер глубины с позиции источника света.
И потом как узнать в пиксельном шейдере какому пикселю рендера шадовмапы соответствует текущий пиксель обычного рендера.
Это надо иметь две камеры? и просто в вершинном дополнительно передавать координаты мировые умноженные на матрицу проекции теневой камеры? И это типо будут координаты в текстуры шадомапы.
Вот допустим для рендера с позиции света, я отрубаю нахрен все шейдеры и текстуры кроме тех, что с прозрачностью. Создаю
xCreateDSS (1024,1024 ) ;
Handle shadowmap=xCreateTexture(1024,1024,256)
Потом делаю рендер. В DSS, я так понимаю, появляется мой буфер глубины с позиции света. Теперь что бы прописать его в текстуру я должен типа как постэффектом пройтись, где уже в текстуру буду писать значение глубины буфера ?
Или наложить на все объекты шейдер который в цвет запишет расстояние от света до пикселей?
А?
|
(Offline)
|
|
18.11.2011, 17:26
|
#255
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
нет. это не теневые объемы. чтобы в текстуру записать глубину с позиции источника света - надо рендерить мир с позиции источника света. текстура должна быть подходящей. 32F например. ну или можно как то хитро собирать в обычную. и распаковывать обратно.
Или наложить на все объекты шейдер который в цвет запишет расстояние от света до пикселей?
|
да. хотя есть специальные depth текстуры. в них можно просто рендерить. хотя ето ближе к ффп.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:51.
|