Вода. Эффект глубины

Научился сам? Помоги начинающему.

Вода. Эффект глубины

Сообщение Woolf 26 июн 2010, 23:14

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

Будем считать, что воду вы уже сделали и она выглядит у вас примерно так:
Изображение

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

Делаем следующее.

1. Берём вот этот http://rghost.ru/1993340 написанный мною скрипт и распаковываем его куда либо в свой проект.

Он же:
WaterLightmapDeep.js
Код: Выделить всё
// by Woolf/R-Age

var fogDensity = 0.00;
var fogColor : Color;
var depthAmbient = 1.50;

var terrainSize : Vector3;
var terrainCollider : Collider;
var texture : Texture2D;
var waterLevel = 10.00;


 

@ContextMenu ("Apply Fog")
function ApplyFog ()
{
   var x = 0.00;
   var y = 0.00;
   while(x < texture.width)
   {
      y = 0.00;
      while(y < texture.height)
      {
         vect = Vector3(parseFloat(x / texture.width) * terrainSize.x, parseFloat(terrainSize.z) , parseFloat(y / texture.height) * terrainSize.y);
         var hit : RaycastHit;
         
         if(terrainCollider.Raycast(Ray(vect, Vector3.up * -terrainSize.z), hit, terrainSize.z))
         {
            depth = waterLevel - hit.point.y;
      
                 if(depth > 0)
            {
               lightCol = texture.GetPixel(x,y);
               curCol = Color.Lerp(lightCol, Color.gray, depthAmbient * depth * fogDensity);
               fog = Vector3(Mathf.Pow(fogColor.r, depth * fogDensity), Mathf.Pow(fogColor.g, depth * fogDensity), Mathf.Pow(fogColor.b, depth * fogDensity));
               texture.SetPixel(x,y, Color(curCol.r * fog.x * lightCol.a, curCol.g * fog.y * lightCol.a, curCol.b * fog.z * lightCol.a, curCol.a));
            }
         }
         y++;
      }
      x++;   
   }
   

   texture.Apply();
}



2. Кидаем скрипт на свой террейн

3. В настройках террейна (иконка с шестерёнкой) указываем Lighting : lightmap
4. Рассчитываем лайтмапу какого хотите разрешения
5. Настраиваем параметры скрипта

Изображение

Fog Density - интенсивность тумана, влияет на прозрачность вашей воды
Fog color - тут что хотите, но я рекомендую цвета ставить тёмные
Depth Ambient - м.. хитромудрый параметр, влияет на подсветку мелких участков, поэксперементируйте )
Terrain Size - вот тут надо указать размеры вашего террейна, X,Y: ширина и длина, Z - высота

Изображение

в коллайдер - коллайдер от террейна
в лайтмап - кидаем лайтмапу терайна,
WaterLevel - устанавливаем высоту (параметр Y) вашей воды, можете посмотреть его у вашего объекта воды.



5. ВНИМАНИЕ - БАГ! сохраняем проект, выходим из редактора. Не знаю почему, но без этих шаманских танцев - не работает.
6. Запускаем редактор, выбираем террейн, выбираем скрипт WaterLightmapDeep, правой кнопкой на заголовок, выбираем Apply Fog
в зависимости от мощности компа и размеров лайтмапы скрипт может работать от 5 до 120 секунд.
по окончанию работы вуаля:

Изображение

Ну чем мог - тем помог, вопросы задавайте сюда.
Последний раз редактировалось Woolf 27 июн 2010, 14:39, всего редактировалось 1 раз.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Вода. Эффект глубины

Сообщение gnoblin 27 июн 2010, 03:28

Спс за урок!

Предлагаю разместить копию на blogs.unity3d.ru

Можешь отредактировать пост и включить скрипт в тело сообщения?
(если rghost сломается, все будем плакать :D )
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Вода. Эффект глубины

Сообщение Woolf 27 июн 2010, 14:40

Скрипт добавил, а блоги вести - органически не перевариваю, уж извините..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Вода. Эффект глубины

Сообщение LiteLight 01 окт 2010, 15:45

А как рассчитать лайтмапу в 3.0?
Аватара пользователя
LiteLight
UNIт
 
Сообщения: 77
Зарегистрирован: 18 сен 2010, 17:23
Откуда: Заб. край, п.Ясногорск

Re: Вода. Эффект глубины

Сообщение DbIMok 01 окт 2010, 16:05

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Вода. Эффект глубины

Сообщение LiteLight 01 окт 2010, 16:29

(3A4OT)
Научите меня искать в документации нужное
Аватара пользователя
LiteLight
UNIт
 
Сообщения: 77
Зарегистрирован: 18 сен 2010, 17:23
Откуда: Заб. край, п.Ясногорск

Re: Вода. Эффект глубины

Сообщение DbIMok 01 окт 2010, 16:39

легко:
1. Help - Unity Manual
2. Ctrl+F - Lightmapping
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Вода. Эффект глубины

Сообщение LiteLight 01 окт 2010, 16:40

Ни работаит :((
Аватара пользователя
LiteLight
UNIт
 
Сообщения: 77
Зарегистрирован: 18 сен 2010, 17:23
Откуда: Заб. край, п.Ясногорск

Re: Вода. Эффект глубины

Сообщение Pyx 01 окт 2010, 22:18

Работает,в Reference ищите.
Pyx
 

Re: Вода. Эффект глубины

Сообщение Woolf 19 окт 2010, 00:39

Хм.. Действительно в3.0 не работает..

UnityException: Texture 'LightmapFar-0' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.LightMapper.ApplyFog () (at Assets/GameAssets/Scripts/Other/LightMapper.js:34)

Я чего-то не понял, где искать эти параметры импорта и как мне получить доступ к лайтмап текстуре.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Вода. Эффект глубины

Сообщение Paul Siberdt 19 окт 2010, 01:17

Тыркните в текстуру и смотрите в инспектор. :-B
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Вода. Эффект глубины

Сообщение Woolf 21 окт 2010, 22:13

Да. Действительно.
Переписал скрипт.

Теперь технология такая:
1) Рендерим лайтмапу
2) Заходим в свойства лайтмапы, адвансед, Устанавливаем енейбл рид/врайт, формат ARGB32
3) Скрипт на террейн, настраиваем
4) Правой кнопкой на скрипт, генерим дно.
5) Любуемся

6) Вертаем настройки лайтмапы взад, на всякий случай.

Было
Изображение

Стало
Изображение

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class WaterLightMapper : MonoBehaviour
{

        public float WaterClarity = 1.5f;//Прозрачность воды (в метрах)
        public float DeepDistance = 0.5f;//На какой глубине начинать затенение
       
        public Color WaterColor;//Цвет воды
        public GameObject Water = null; //ГО воды
        public Vector3 terrainSize;     // Размер террейна. Ширина, Длина, Высота
        public Collider terrainCollider = null; // Коллайдер террейна
        public Texture2D texmap = null; //Лайтмапа     
       
        private float WaterLevel = 0f;
       
        [ContextMenu("Generate Waterdeep map")]
        public void generate ()
        {
                //Теперь сам генератор               
                int x = 0;
                int y = 0;
                int cnt=0;
                WaterLevel = Water.transform.position.y;
               
                while (x < texmap.width) {
                        y = 0;
                        while (y < texmap.height) {
                               
                                float dtx = (float)x / (float)texmap.width * (float)terrainSize.x + terrainCollider.transform.position.x;
                                float dty = (float)y / (float)texmap.height * (float)terrainSize.y + terrainCollider.transform.position.z;
                               
                                float depth = getDepth (new Vector3 (dtx, terrainSize.z + terrainCollider.transform.position.y, dty));
                               
                       
                                if (depth-DeepDistance > 0) {
                                        // Ниже уровня воды и DeepDistance
                                        Color col=texmap.GetPixel (x, y);
                                        float r;
                                        float g;
                                        float b;                       
                                       
                                        if (depth>WaterClarity+DeepDistance) {
                                          //Глубина больше прозрачности, затемняем грунт
                                               
                                          float mixkf=(WaterClarity+DeepDistance)/depth; // КФ смешивания с учётом освещенности 
                                          r=WaterColor.r*mixkf;
                                          g=WaterColor.g*mixkf;
                                          b=WaterColor.b*mixkf;
                                               
                                        } else {
                                                //Плавно сводим цвет дна к цвету воды     
                                                float mixkf=depth/(WaterClarity+DeepDistance); // КФ смешивания    
                                                r=(col.r-(1-WaterColor.r)*mixkf);
                                                g=(col.g-(1-WaterColor.g)*mixkf);
                                                b=(col.<img src="./images/smilies/66.gif" alt="b-(" title="Beat up" />1-WaterColor.b)*mixkf);
                                               
                                               
                                                if (r>1f) r=1f;
                                                if (g>1f) g=1f;
                                                if (b>1f) b=1f;
                                               
                                                if (r<0f) r=0f;
                                                if (g<0f) g=0f;
                                                if (b<0f) b=0f;                                        
                                               
                                        }
                                       
                                       

                                       
                                        texmap.SetPixel (x, y, new Color (r, g, b, col.a));
                                        cnt++;
                                }
                               
                                y++;
                        }
                        x++;
                }
               
                texmap.Apply ();
                Debug.Log("Pixels "+cnt);  
        }
       
       
       
        private float getDepth (Vector3 pos)
        {
                float res = -1;
               
                Ray ray = new Ray (pos, Vector3.down);
                RaycastHit hit = new RaycastHit ();
               
                if (terrainCollider.Raycast (ray, out hit, terrainSize.z)) {
                        res = WaterLevel - hit.point.y;
                }
                //Debug.Log(res);  
                return res;
        }
}

 
Последний раз редактировалось Woolf 21 окт 2010, 22:40, всего редактировалось 2 раз(а).
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Вода. Эффект глубины

Сообщение Neodrop 21 окт 2010, 22:28

тег syntax сделает ваш код куда более читаемым. ;)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Вода. Эффект глубины

Сообщение darkmonk21 16 июл 2015, 12:23

А как можна в юнити 5 так сделать?
darkmonk21
UNец
 
Сообщения: 7
Зарегистрирован: 14 июл 2015, 12:29

Re: Вода. Эффект глубины

Сообщение Woolf 16 июл 2015, 16:24

А в 5ке уже давно есть вода с эффектом глубины нормальным и не нужны подобные фейковые
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

След.

Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4