Перейти к контенту

Рекомендуемые сообщения

А чьи?

А ты как думаешь?

 

 

#ifndef	_SUN_SHAFTS
	#define _SUN_SHAFTS
	#include "common.h"

	#define SS_FARPLANE 180

uniform float4 common_params2;
uniform sampler2D s_jitter_0;	// стандартный шум, 64x64
uniform sampler2D s_jitter_1;	// стандартный шум, 64x64
uniform sampler2D s_jitter_5;	// шум высокого разрешения, 1024x1024

	float normalize_depth(float depth) {
		return (saturate(depth/SS_FARPLANE));
	}

	float3 blend_soft_light(float3 a, float3  {
		float3 c = 2 * a * b + a * a * (1 - 2 * ;
		float3 d = sqrt(a) * (2 * b - 1) + 2 * a * (1 - ;
		return ( b < 0.5 )? c : d;
	}

	float3 calc_sunshafts(float2 tc, float3 init_color) {
		#ifdef USE_SUN_SHAFTS
			float3 out_color = float3(0,0,0);
			float sun_dist = SS_FARPLANE / (sqrt(1 - L_sun_dir_w.y * L_sun_dir_w.y));
			float4 sun_pos_projected = mul( m_VP, float4( sun_dist * L_sun_dir_w + eye_position, 1 ) );
			float4 sun_pos_screen = convert_to_screen_space(sun_pos_projected)/sun_pos_projected.w;
			float2 sun_vec_screen = sun_pos_screen.xy - tc;

			float angle_cos = dot(-eye_direction, normalize(L_sun_dir_w));
			float ray_fade = saturate(saturate(angle_cos)*(1 - saturate(sun_vec_screen))*saturate(length(sun_vec_screen)*1000));
			float2 init_tc = tc;

			float3 pos = tex2D(s_position, tc);
			float dep = pos.z;
			float mask = (saturate(angle_cos*0.1 + 0.9) + normalize_depth(pos.z) - 0.99999) * SS_DENSITY;
			sun_vec_screen *= angle_cos * SS_DENSITY / SS_SAMPLES;
			float depth_accum = 0;

			for (float i = 0; i < SS_SAMPLES; i++) {
				tc += sun_vec_screen;
				#ifdef SS_BLUR
					float blur_delta = 2 * (.5f/1024.f);
					out_color += (tex2Dlod(s_image, float4(tc + blur_delta,0,0)) + tex2Dlod(s_image, float4(tc - blur_delta,0,0))) * (1.f/2.f) * SS_BLEND_FACTOR;
				#else
					out_color += float3(0.2, 0.2, 0.2);
				#endif
				depth_accum += saturate(1 - tex2D(s_position, tc).z*1000);
			}
			out_color *= saturate(depth_accum/SS_SAMPLES);

		#ifdef SS_DUST
			float dust_size = 8/SS_DUST_SIZE;
			float3 jit;
			float2 jtc = init_tc;
			float2 sun_dir_e = L_sun_dir_e.xy;
			sun_dir_e /= sin(common_params2.x);
			sun_dir_e *= common_params2.y;
			jtc.x += sun_dir_e.x;
			jtc.y -= sun_dir_e.y;
			jtc.x = (jtc.x > 1.0)?(jtc.x-1.0):jtc.x;
			jtc.y = (jtc.y < 0.0)?(1.0-jtc.y):jtc.y;
			jit.x = tex2D(s_jitter_0, float2(jtc.x, jtc.y + timers.x*0.01*SS_DUST_SPEED)*dust_size).x;
			jit.y = tex2D(s_jitter_1, float2(jtc.x + timers.x*0.01*SS_DUST_SPEED, jtc.y)*dust_size).y;
			jit.z = tex2D(s_jitter_5, jtc).x;
			jit.z = saturate(jit.z + SS_DUST_DENSITY - 1);
			float3 dust = saturate(float3(jit.x, jit.x, jit.x)*float3(jit.y, jit.y, jit.y)*float3(jit.z, jit.z, jit.z));
			float len = length(dust);
			dust *= SS_DUST_INTENSITY;
			dust = lerp(0, dust, (1 - saturate(dep * 0.2)) * (1 - saturate((0.001 - dep)*10000.0)));
			dust += float3(1,1,1);
		#else
			float3 dust = float3(1,1,1);
		#endif

			out_color *= 2.0 * ray_fade / SS_SAMPLES * dust;
		#ifdef USE_MBLUR
			out_color = init_color + out_color * L_sun_color * (7.0 - init_color); // MBLUR 7.0
		#else
			out_color = init_color + out_color * L_sun_color * (0.7 - init_color); // NOT MBLUR 0.7
		#endif
		#ifdef USE_MBLUR
			out_color = blend_soft_light(out_color, L_sun_color * mask * -0.1 + 0.7) - init_color; // MBLUR 0.7
		#else
			out_color = blend_soft_light(out_color, L_sun_color * mask * -0.1 + 0.6) - init_color; // NOT MBLUR 0.6
		#endif
			return out_color;
		#else
			return 0;
		#endif
	}
#endif 

 

 

 

 

 

/*  Volumetric Sunlights aka GodRays aka Sunshafts
	made by K.D. (OGSE team)
	used papers:
	1) GPU Gems 3. Volumetric Light Scattering as a Post-Process (Kenny Mitchell)
	2) Реализация процессора эффектов постобработки. Часть 2 - Создание пост-эффектов. (Владимир Дьячков «Nikola Tesla»)
	3) Crysis shaders */

#ifndef	OGSE_SUNSHAFTS_H
	#define OGSE_SUNSHAFTS_H
	#include "common.h"
	#ifndef SS_QUALITY
		#define	SS_MAX_SAMPLES int(3)
	#else
		#if SS_QUALITY==1
			#define	SS_MAX_SAMPLES int(20)
		#else
			#if SS_QUALITY==2
				#define	SS_MAX_SAMPLES int(50)
			#else
				#if SS_QUALITY==3
					#define	SS_MAX_SAMPLES int(100)
				#endif
			#endif
		#endif
	#endif
	#define SS_FARPLANE float(180.0)
uniform float4 common_params2;
uniform sampler2D s_jitter_0;	// стандартный шум, 64x64
uniform sampler2D s_jitter_1;	// стандартный шум, 64x64
uniform sampler2D s_jitter_5;	// шум высокого разрешения, 1024x1024
	float normalize_depth(float depth)
	{
		return (saturate(depth/SS_FARPLANE));
	}
	 float3 blend_soft_light(float3 a, float3 
	{
		float3 c = 2 * a * b + a * a * (1 - 2 * ;
		float3 d = sqrt(a) * (2 * b - 1) + 2 * a * (1 - ;
		return ( b < 0.5 )? c : d;
	}
	float3 sunshafts(float2 tc, float3 init_color)
	{  
		// dist to the sun
		float sun_dist = SS_FARPLANE / (sqrt(1 - L_sun_dir_w.y * L_sun_dir_w.y));
		// sun pos
		float3 sun_pos_world = sun_dist*L_sun_dir_w + eye_position;
		float4 sun_pos_projected = mul(m_VP, float4(sun_pos_world, 1));
		float4 sun_pos_screen = convert_to_screen_space(sun_pos_projected)/sun_pos_projected.w;
		// sun-pixel vector
		float2 sun_vec_screen = sun_pos_screen.xy - tc;
		// calculate filtering effect. sunshafts must appear only when looking in the sun dir
		float angle_cos = dot(-eye_direction, normalize(L_sun_dir_w));
		float ray_fade = saturate(saturate(angle_cos)*(1 - saturate(dot(sun_vec_screen, sun_vec_screen)))*saturate(length(sun_vec_screen)));
		float2 init_tc = tc;
		
		float3 pos = tex2D(s_position, tc);
		float dep = pos.z;
		float depth = normalize_depth(dep);
		float mask = (saturate(angle_cos*0.1 + 0.9) + depth - 0.99999) * SS_BLEND_FACTOR;
		// adjust sampling
		sun_vec_screen *= angle_cos * SS_DENSITY / SS_MAX_SAMPLES;

		// sampling image along ray
		float3 accum = 0;
		float depth_accum = 0;
		for (int i = 0; i < SS_MAX_SAMPLES; i++)
		{ 
			tc += sun_vec_screen;
			depth = normalize_depth(tex2D(s_position, tc).z);
			accum += depth * (1 - i / SS_MAX_SAMPLES);
			depth_accum += saturate(1 - depth*1000);
		}
		accum *= saturate(depth_accum/SS_MAX_SAMPLES*5);
	#ifdef SS_DUST
		float dust_size = 8/SS_DUST_SIZE;
		float3 jit;
		float2 jtc = init_tc;
		float2 sun_dir_e = L_sun_dir_e.xy;
		sun_dir_e /= sin(common_params2.x);
		sun_dir_e *= common_params2.y;
		jtc.x += sun_dir_e.x;
		jtc.y -= sun_dir_e.y;
		jtc.x = (jtc.x > 1.0)?(jtc.x-1.0):jtc.x;
		jtc.y = (jtc.y < 0.0)?(1.0-jtc.y):jtc.y;
		jit.x = tex2D(s_jitter_0, float2(jtc.x, jtc.y + timers.x*0.01*SS_DUST_SPEED)*dust_size).x;
		jit.y = tex2D(s_jitter_1, float2(jtc.x + timers.x*0.01*SS_DUST_SPEED, jtc.y)*dust_size).y;
		jit.z = tex2D(s_jitter_5, jtc).x;
		jit.z = saturate(jit.z + SS_DUST_DENSITY - 1);
		float3 dust = saturate(float3(jit.x, jit.x, jit.x)*float3(jit.y, jit.y, jit.y)*float3(jit.z, jit.z, jit.z));
		float len = length(dust);
		dust *= SS_DUST_INTENSITY;
		dust = lerp(0, dust, (1 - saturate(dep * 0.2)) * (1 - saturate((0.001 - dep)*10000.0)));
		dust += float3(1,1,1);
	#else
		float3 dust = float3(1,1,1);
	#endif
		
		// watch some magic: if sun is occluded by terrain or some buildings, sunshafts must be eliminated. Otherwise image is terrible.
		accum *= 2 * ray_fade / SS_MAX_SAMPLES * dust;// * (1 - mat);
		// blending
		float3 out_color = init_color + accum * L_sun_color * (1.0 - init_color);
		out_color = blend_soft_light(out_color, L_sun_color * mask * 0.5 + 0.5) - init_color;
		return out_color;
	}  
	float3 calc_sunshafts(float2 tc, float3 init_color) {
		#ifndef	SS_QUALITY
			return 0;
		#else
			return sunshafts(tc, init_color);
		#endif	
	}
#endif 

 

 

 

Твой вариант был отстой как бы их не настраивай.

 

Так они и в оригинале качаются.

Только очень слабо, я зделал как в ЛА. Увеличив некоторые циферки.

Изменено пользователем Anonim
  • Нравится 3
  • Не нравится 2
Ссылка на комментарий

 

 

в общем какой шейдер нужно выставить для модели что-бы подобного небыло?

Да как обычно. Для динамических моделей это models\model.

  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

Добрый вечер, ребята! перезалейте пожалуйста ссылку с шапки темы (правленные шейдеры), уж очень охота посмотреть на новую картинку, уже лет 5 не играл, да и то всё минималки да минималки, а в живую вот что наблюдаю в пеших прогулках по известному всеми месту почти каждый год :) жаль правда трубу уже попилили на металолом, уже не то :(

100_21282012066.jpg

Ссылка на комментарий

Подскажите какую-нибудь понятную литературу по игровой графике, или если есть то конкретно что-то похожее по графике сталкера. А то методом тыка оно конечно занимательно, но медленно и неправильно я считаю. Наверное вопрос больше адресован к @KD87.

 

@Anonim, нажимаю на ссылку вылетает эта же страница в новой вкладке. Скопируй еще раз пожалуйста.

Изменено пользователем Карлан
Ссылка на комментарий

Интересует такой момент - как привязать новый скриптовый шейдер к модели? И, может подскажете еще, как сделать шейдер с двигающейся текстурой? И есть ли какой-нибудь способ управлять шейдерами через скрипты, например менять один на другой в процессе игры? :russian_ru:

Ссылка на комментарий

Вот такое есть по сталкиру:http://www.gamedev.ru/community/gamedev_lecture/articles/r_e_n_de_r

Мегаполезная вещь, но надо немного понимать, о чем человек говорит. В целом почитайте статьи и глоссарий на gamedev.ru. Тоже помогает. Там про шейдеры отличная статья есть, с примерами. Правда, по первости даже так непонятно. Но тут уж деваться некуда.

 

 

 

Интересует такой момент - как привязать новый скриптовый шейдер к модели?

Задублируй любой имеющийся в сдк, там же переназначь, потом напиши  его и закинь в папку шейдеров.

 

 

 

И, может подскажете еще, как сделать шейдер с двигающейся текстурой?

Это в каком плане? Скролл, что ли? В шедйеры экспортированы таймеры, юниформ timers. В x лежит линейный таймер как раз, привяжи к нему текстурные координаты.

 

 

 

 

И есть ли какой-нибудь способ управлять шейдерами через скрипты, например менять один на другой в процессе игры?

Да, исходники же есть. Можешь придумать что угодно. Штатно - нет.

  • Нравится 1
Ссылка на комментарий
В x лежит линейный таймер как раз

 

там же переназначь

 

Можно об этом подробнее?

 

Правильно ли я понял - для связки нужно создать скриптовый шейдер с названием папка_шейдер как у обычного? 

Изменено пользователем Scarabay
Ссылка на комментарий

Не существуют, но возможно. Просто по аналогии.

 

 

 

Правильно ли я понял - для связки нужно создать скриптовый шейдер с названием папка_шейдер как у обычного? 

Правильно.

  • Спасибо 3
Ссылка на комментарий

С учётом наличия исходников какими способами можно тестировать сталкерские шейдера на скорость выполнения \ оптимизацию? А точнее конкретно нужный шейдер протестировать. 

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Надежно - никаким. Драйвер помещает вызовы на отрисовку в очередь команд, которая потом по заполнении загружается в видеокарту. В итоге измерение времени выполнения может тебе показать проблему совершенно не в том месте. Подробно можно почитать тут. Там же и написано, как можно улучшить ситуацию. Еще можно поглядеть в сторону плагина NSight для студии. Он умеет профилировать и вообще тулза отличная. Только надо будет ставить старую версию, 3.2, иначе не заведется под dx9. Мне плагин адекватные вещи показывал в плане производительности. Впрочем, надо помнить вышеприведенную памятку от MS. Самый косвенный способ - смотреть дизассемблированные шейдеры. Правил немного и они простые - чем меньше инструкций, тем лучше. Избегай тригонометрии и вложенных циклов. Не семплируй в цикле с помощью tex2D. Компиль шейдеры под самую высокую доступную шейдерную модель. Не компиль с флагом D3DXSHADER_USE_LEGACY_D3DX9_31_DLL.

  • Спасибо 1
Ссылка на комментарий

Здаров народ. Такая заморочка, вводил ли кто то gloss в доблестный зов припяти ? Наглядный пример нужного ппш в ogse который недавно вышел. 

Ссылка на комментарий

Азраэль, он никуда и не уходил

QZ6q_mWhtf4.jpg

Не знаю, что там такого в том ППШ, это было из коробки в любой игре серии.

  • Спасибо 1

Убедитесь, что вы имеете право убедиться

Ссылка на комментарий

Ребята!Посоветуйте...

Есть ли программа по совмещению шейдеров из 2 shaders.xr из разных игр (например ТЧ оригинал и Лост альфа) в один файл?

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...