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?
Прикладываю проект. Может кто сможет помочь...


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

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