![](images/chestnut/misc/left.gif) |
30.07.2014, 11:31
|
#1
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Depth water shader
Уважаемые, кто-нибудь может рассказать на каком принципе работает этот шейдер?
Как рассчитывается, затемнение в зависимости от глубины воды?
Можно ли написать подобный шейдер для бесплатной версии Unity?
Вот пример работы данного шейдера:
http://approject.comxa.com
И тема на форуме Unity, за 2009 год:
http://forum.unity3d.com/threads/wat...y-indie.25294/
|
(Offline)
|
|
31.07.2014, 07:52
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Depth water shader
На сколько я понимаю, в шейдере можно использовать текстуру глубины с камеры
sampler2D _CameraDepthTexture;
Она используется например для мягких частиц. Ее, видимо, можно использовать для получения такого эффекта.
В примере для отражений видимо используется скайбокс, поэтому, скорее всего, такую же воду можно сделать на бесплатной версии Unity.
В unity есть два пакаджа для воды, для бесплатной версии и для Pro.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
31.07.2014, 11:53
|
#3
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
Андрей а сложно ли написать такой шейдер?
Нужно чтобы чем больше было расстояние между водой и песком, тем темнее была бы вода.
Я собрал сцену с водой и песком (картинка ниже), сцену прикладываю к сообщению. Не мог бы ты мне помочь с написанием такого шейдера? С чего начать? Может еще кому-нибудь пригодиться.
|
(Offline)
|
|
31.07.2014, 12:42
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Depth water shader
К сожалению у меня не хватает опыта написания подобных шейдеров
|
(Offline)
|
|
31.07.2014, 12:44
|
#5
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
Ну ладно, буду искать решение. Можно конечно еще сделать маску проскандировав дно, и в зависимости от глубины заполнить карту прозрачности...
|
(Offline)
|
|
31.07.2014, 13:06
|
#6
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Depth water shader
а)
1. читаешь _CameraDepthTexture
2. берёшь аналогичную глубину фрагмента воды
3. находишь разницу между ними
4. юзаешь как коэф для альфы
б)
1. читаешь карту высот террейна
2. берёшь высоту воды в такой же системе координат
3. находишь разницу между ними
4. юзаешь как коэф для альфы
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
31.07.2014, 13:06
|
#7
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
Решение нашлось... нужно просто не шейдер воды менять, а шйедер земли.
http://jakobknudsen.com/?p=224
Учитывая позицию по высоте
IN.pos.y
Меняем яркость текстуры
|
(Offline)
|
|
31.07.2014, 13:19
|
#8
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
а)
1. читаешь _CameraDepthTexture
2. берёшь аналогичную глубину фрагмента воды
3. находишь разницу между ними
4. юзаешь как коэф для альфы
Вот теперь стало понятно как это работает: CamerDepthводы-_CameraDepthTexture)
Но это наверное в будущем. Так как сам я вряд ли такой шейдер напишу, квалификация в этом деле у меня тоже недостаточная)
Плюс там еще какие-то команды в коде вроде нужно использовать в чем их таинственный смысл мне вообще не понятно.
http://docs.unity3d.com/Manual/SL-Ca...thTexture.html
|
(Offline)
|
|
31.07.2014, 13:20
|
#9
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Depth water shader
_CameraDepthTexture-высота воды
|
не, если ты глубину экрана юзаешь, то тебе нужна не высота воды, а такая же экранная глубина воды.
а высота воды пойдёт, если ты с картой высот террейна сравниваешь.
|
(Offline)
|
|
01.08.2014, 09:23
|
#10
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
Вообще нужно попробовать написать этот шейдер. Интересно, а андроид его потянет?
p.s. Mr_F_ , полистал твой блог, судя по темам, у тебя опыт работы с шейдерами приличный)
|
(Offline)
|
|
01.08.2014, 13:00
|
#11
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
Что-то получается да не то...
Что делает Linear01Depth ?
|
(Offline)
|
|
01.08.2014, 13:05
|
#12
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Depth water shader
там же вроде комент рядом с этой функцией в юнитевском инклуде
// Z buffer to linear 0..1 depth (0 at eye, 1 at far plane)
|
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.08.2014, 11:23
|
#13
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
Получилось извлечь линейную глубину изображения.
Как я понял поверхность дна должна отрисовываться в 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
}
}
}
|
(Offline)
|
|
04.08.2014, 12:59
|
#14
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Depth water shader
. Но как сделать чтобы шейдер воды не вносил изменения в z буффер? Вставил ZWrite OFF не работает...
|
именно zwrite off, в чём то другом трабла
|
(Offline)
|
|
04.08.2014, 13:46
|
#15
|
Разработчик
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений (для 100 пользователей)
|
Ответ: Depth water shader
"Queue" - как я понял определяет положение в очереди прорисовки.
"RenderType"="Transparent" - Transparent не может влиять на Z buffer?
Прикладываю проект. Может кто сможет помочь...
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:58.
|