forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Эффекты/Шейдеры (http://forum.boolean.name/forumdisplay.php?f=170)
-   -   Depth water shader (http://forum.boolean.name/showthread.php?t=19333)

Evgen 30.07.2014 11:31

Depth water shader
 
Уважаемые, кто-нибудь может рассказать на каком принципе работает этот шейдер?
Как рассчитывается, затемнение в зависимости от глубины воды?
Можно ли написать подобный шейдер для бесплатной версии Unity?

Вот пример работы данного шейдера:
http://approject.comxa.com

И тема на форуме Unity, за 2009 год:
http://forum.unity3d.com/threads/wat...y-indie.25294/

pax 31.07.2014 07:52

Ответ: Depth water shader
 
На сколько я понимаю, в шейдере можно использовать текстуру глубины с камеры
PHP код:

sampler2D _CameraDepthTexture

Она используется например для мягких частиц. Ее, видимо, можно использовать для получения такого эффекта.

В примере для отражений видимо используется скайбокс, поэтому, скорее всего, такую же воду можно сделать на бесплатной версии Unity.

В unity есть два пакаджа для воды, для бесплатной версии и для Pro.

Evgen 31.07.2014 11:53

Ответ: Depth water shader
 
Вложений: 2
Андрей а сложно ли написать такой шейдер?
Нужно чтобы чем больше было расстояние между водой и песком, тем темнее была бы вода.
Я собрал сцену с водой и песком (картинка ниже), сцену прикладываю к сообщению. Не мог бы ты мне помочь с написанием такого шейдера? С чего начать? Может еще кому-нибудь пригодиться.

pax 31.07.2014 12:42

Ответ: Depth water shader
 
К сожалению у меня не хватает опыта написания подобных шейдеров

Evgen 31.07.2014 12:44

Ответ: Depth water shader
 
Ну ладно, буду искать решение. Можно конечно еще сделать маску проскандировав дно, и в зависимости от глубины заполнить карту прозрачности...

Mr_F_ 31.07.2014 13:06

Ответ: Depth water shader
 
а)
1. читаешь _CameraDepthTexture
2. берёшь аналогичную глубину фрагмента воды
3. находишь разницу между ними
4. юзаешь как коэф для альфы

б)
1. читаешь карту высот террейна
2. берёшь высоту воды в такой же системе координат
3. находишь разницу между ними
4. юзаешь как коэф для альфы

Evgen 31.07.2014 13:06

Ответ: Depth water shader
 
Решение нашлось... нужно просто не шейдер воды менять, а шйедер земли.
http://jakobknudsen.com/?p=224

Учитывая позицию по высоте
IN.pos.y
Меняем яркость текстуры

Evgen 31.07.2014 13:19

Ответ: Depth water shader
 
Код:

а)
1. читаешь _CameraDepthTexture
2. берёшь аналогичную глубину фрагмента воды
3. находишь разницу между ними
4. юзаешь как коэф для альфы

Вот теперь стало понятно как это работает: CamerDepthводы-_CameraDepthTexture)
Но это наверное в будущем. Так как сам я вряд ли такой шейдер напишу, квалификация в этом деле у меня тоже недостаточная)

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


http://docs.unity3d.com/Manual/SL-Ca...thTexture.html

Mr_F_ 31.07.2014 13:20

Ответ: Depth water shader
 
Цитата:

_CameraDepthTexture-высота воды
не, если ты глубину экрана юзаешь, то тебе нужна не высота воды, а такая же экранная глубина воды.
а высота воды пойдёт, если ты с картой высот террейна сравниваешь.

Evgen 01.08.2014 09:23

Ответ: Depth water shader
 
Вообще нужно попробовать написать этот шейдер. Интересно, а андроид его потянет?
p.s. Mr_F_ , полистал твой блог, судя по темам, у тебя опыт работы с шейдерами приличный)

Evgen 01.08.2014 13:00

Ответ: Depth water shader
 
Вложений: 2
Что-то получается да не то...
Что делает Linear01Depth ?

Mr_F_ 01.08.2014 13:05

Ответ: Depth water shader
 
Цитата:

Linear01Depth
там же вроде комент рядом с этой функцией в юнитевском инклуде

Цитата:

// Z buffer to linear 0..1 depth (0 at eye, 1 at far plane)

Evgen 04.08.2014 11:23

Ответ: Depth water shader
 
Вложений: 1
Получилось извлечь линейную глубину изображения.
Как я понял поверхность дна должна отрисовываться в z-buffer, после чего шейдер воды должен считывать показания z буфера и на основе этого уже определять затемненность воды. Но как сделать чтобы шейдер воды не вносил изменения в z буффер? Вставил ZWrite OFF не работает...

Код:

Shader "Render Depth" {
SubShader {
    Tags { "Queue"="Geometry+10" "IgnoreProjector"="True" "RenderType"="Transparent"  }
    Pass {
   
        ZWrite Off
        //Ztest always
        LOD 500
        Fog { Mode Off }
        CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members worldPos)
#pragma exclude_renderers d3d11 xbox360

        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"
 

        struct v2f {
            float4 pos : SV_POSITION;
            float2 depth : TEXCOORD0;
        };

        v2f vert (appdata_base v) {
            v2f o;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            UNITY_TRANSFER_DEPTH(o.depth);
            return o;
        }

        half4 frag(v2f i) : COLOR {       
                float d = i.depth.x/i.depth.y;        //получаем глубину аналогично UNITY_OUTPUT_DEPTH(i.depth);       
                d=Linear01Depth(d);                        // Преобразуем в линейное значение
                return half4(d,d,d,0.5);                // Возвращаем цвет
                             
        }
                       
        ENDCG
    }
}
}


Mr_F_ 04.08.2014 12:59

Ответ: Depth water shader
 
Цитата:

. Но как сделать чтобы шейдер воды не вносил изменения в z буффер? Вставил ZWrite OFF не работает...
именно zwrite off, в чём то другом трабла

Evgen 04.08.2014 13:46

Ответ: Depth water shader
 
Вложений: 1
"Queue" - как я понял определяет положение в очереди прорисовки.
"RenderType"="Transparent" - Transparent не может влиять на Z buffer?
Прикладываю проект. Может кто сможет помочь...

Evgen 04.08.2014 14:12

Ответ: Depth water shader
 
Мне кажется z берется не из Z буфера...

Mr_F_ 04.08.2014 14:17

Ответ: Depth water shader
 
твой шейдер выводит глубину самого объекта, на который он наложен, если что.
возможно ты попутал что-то и хочешь увидеть в нём глубину того что под водой? или я не так понял, что ты хотел им показать?

Evgen 04.08.2014 14:43

Ответ: Depth water shader
 
Я пытаюсь извлечь глубину из z-buffera что-то вроде: d=Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_CameraDe pthTexture,i.uv)));
Но ни как не получается, уже много вариантов перебрал...
Может в indie эта функция заблокирована?(
Для начала я пытаюсь извлечь значение z земли, что под водой из z буфера...
Потом от этого отнять высоту воды
Ну и затемнить воду по этому значению.
Была такая depth water, но в 4 версии Unity она не работает(

pax 04.08.2014 18:09

Ответ: Depth water shader
 
Возьми любой шейдер частиц (частицы работают на Free), там все что тебе надо находится вот в таком условии:
PHP код:

#ifdef SOFTPARTICLES_ON
...
#endif 

ну и еще надо sampler2D_float _CameraDepthTexture;

Evgen 05.08.2014 17:35

Ответ: Depth water shader
 
Вот ссылка на что_то подобное:
http://forum.unity3d.com/threads/ble...slider.253270/

В чем разница: sampler2D_float _CameraDepthTexture ?
В Google упоминается всего пару раз.

pax 05.08.2014 17:54

Ответ: Depth water shader
 
В шейдере частиц данный самплер задан вне директив препроцессора. Поэтому я его привел.

Evgen 20.08.2014 14:17

Ответ: Depth water shader
 
Оставлю пока этот шейдер до лучших времен

Izunad 19.09.2014 20:43

Ответ: Depth water shader
 
По идее если учитывать глубину воды то схема будет такая

прячем плоскость воды
срезаем все что выше воды
рендерим сцену высот (низменость светлая/высота темная)-> сохраняем в текстуру N1 КАРТА ВЫСОТ

далее рендерим эту же сцену с нормальными текстурами -> сохраняем в текстуру N2 КАРТА ПРОЗРАЧНОСТИ/ПРЕЛОМЛЕНИЯ

далее срезаем все что ниже воды
опускаем камеру(важно повернуть правильно)
рендерим ->сохраняем в текстуру N3 КАРТА ОТРАЖЕНИЯ

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

Естественно в последнем рендере координаты текстур являются проекционными, то есть ориентируемся по экрану

Код:

VS
OUT.Position = mul(IN.Position, matrixWorldViewProject);
OUT.TexProj.x = 0.5f*(OUT.Position.w+OUT.Position.x);
OUT.TexProj.y = 0.5f*(OUT.Position.w-OUT.Position.y);
OUT.TexProj.z = OUT.Position.w;


PS
tex2D(TextureSampler,IN.TexProj.xy/IN.TexProj.z)

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


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

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