Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Эффекты/Шейдеры

Ответ
 
Опции темы
Старый 30.07.2014, 11:31   #1
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Depth water shader

На сколько я понимаю, в шейдере можно использовать текстуру глубины с камеры
sampler2D _CameraDepthTexture
Она используется например для мягких частиц. Ее, видимо, можно использовать для получения такого эффекта.

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

В unity есть два пакаджа для воды, для бесплатной версии и для Pro.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Evgen (31.07.2014)
Старый 31.07.2014, 11:53   #3
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: Depth water shader

Андрей а сложно ли написать такой шейдер?
Нужно чтобы чем больше было расстояние между водой и песком, тем темнее была бы вода.
Я собрал сцену с водой и песком (картинка ниже), сцену прикладываю к сообщению. Не мог бы ты мне помочь с написанием такого шейдера? С чего начать? Может еще кому-нибудь пригодиться.
Миниатюры
Нажмите на изображение для увеличения
Название: scene.PNG
Просмотров: 1290
Размер:	296.4 Кб
ID:	20771  
Вложения
Тип файла: zip WaterShader.zip (887.4 Кб, 552 просмотров)
(Offline)
 
Ответить с цитированием
Старый 31.07.2014, 12:42   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Depth water shader

К сожалению у меня не хватает опыта написания подобных шейдеров
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 31.07.2014, 12:44   #5
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: Depth water shader

Ну ладно, буду искать решение. Можно конечно еще сделать маску проскандировав дно, и в зависимости от глубины заполнить карту прозрачности...
(Offline)
 
Ответить с цитированием
Старый 31.07.2014, 13:06   #6
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Depth water shader

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

б)
1. читаешь карту высот террейна
2. берёшь высоту воды в такой же системе координат
3. находишь разницу между ними
4. юзаешь как коэф для альфы
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
Evgen (31.07.2014), KCEPOKC (04.08.2014)
Старый 31.07.2014, 13:06   #7
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Depth water shader

_CameraDepthTexture-высота воды
не, если ты глубину экрана юзаешь, то тебе нужна не высота воды, а такая же экранная глубина воды.
а высота воды пойдёт, если ты с картой высот террейна сравниваешь.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 01.08.2014, 09:23   #10
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: Depth water shader

Вообще нужно попробовать написать этот шейдер. Интересно, а андроид его потянет?
p.s. Mr_F_ , полистал твой блог, судя по темам, у тебя опыт работы с шейдерами приличный)
(Offline)
 
Ответить с цитированием
Старый 01.08.2014, 13:00   #11
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: Depth water shader

Что-то получается да не то...
Что делает Linear01Depth ?
Миниатюры
Нажмите на изображение для увеличения
Название: dp.PNG
Просмотров: 1355
Размер:	222.4 Кб
ID:	20775  
Вложения
Тип файла: zip WaterShader.zip (1.52 Мб, 539 просмотров)
(Offline)
 
Ответить с цитированием
Старый 01.08.2014, 13:05   #12
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Depth water shader

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

// Z buffer to linear 0..1 depth (0 at eye, 1 at far plane)
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Evgen (04.08.2014)
Старый 04.08.2014, 11:23   #13
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 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
    }
}
}
Миниатюры
Нажмите на изображение для увеличения
Название: zcom.PNG
Просмотров: 1259
Размер:	12.8 Кб
ID:	20779  
(Offline)
 
Ответить с цитированием
Старый 04.08.2014, 12:59   #14
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Depth water shader

. Но как сделать чтобы шейдер воды не вносил изменения в z буффер? Вставил ZWrite OFF не работает...
именно zwrite off, в чём то другом трабла
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 04.08.2014, 13:46   #15
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 419
Написано 68 полезных сообщений
(для 100 пользователей)
Ответ: Depth water shader

"Queue" - как я понял определяет положение в очереди прорисовки.
"RenderType"="Transparent" - Transparent не может влиять на Z buffer?
Прикладываю проект. Может кто сможет помочь...
Вложения
Тип файла: zip WaterShader.zip (1.27 Мб, 559 просмотров)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com