Перейти к содержанию

Атмосферные поездки от Abot


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

Ну, теперь осталось сделать рыбаков, которые плывут на глубину, а не просто стоят на лодках (как в моде с расписаниями) и снующих между городами/по морю/по реке людей на гуарах, силт-страйдерах, лодках, кораблях. Не часто, конечно же, а так, за день парочку в разных частях Морровинда, к примеру. И Морровинд оживет.

А потом можно будет реализовать торговлю между городами. То есть, к примеру, появился погонщик гуаров из Кальдеры в Сейда Нин - всё, теперь у Арилла, к примеру, можно купить что-нибудь новое. И так далее. Так что простор для интерактивности открыт.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Интересно а в моде есть возможность при желании пропустить поездку?) если нету, и если это возможно, надо бы разработчику её прикрутить) а то это конечно весело и атмосферно, вот так вот ездить) но не всегда хочется тратить кучу времен на это)

Немного оффтопа... А на последнем видео от Марка, это что там континентальная часть от TR ? а то, что то она как то больно близка к Солстхейму

Изменено пользователем ShadowMimicry
Ссылка на комментарий
Поделиться на другие сайты

Немного оффтопа... А на последнем видео от Марка, это что там континентальная часть от TR ? а то, что то она как то больно близка к Солстхейму
Да.
Ссылка на комментарий
Поделиться на другие сайты

Интересно а в моде есть возможность при желании пропустить поездку?)

Есть, ковыряйся в опциях.

Ссылка на комментарий
Поделиться на другие сайты

Интересно а в моде есть возможность при желании пропустить поездку?

 

Так активируй страйдер пробелом и будет счастье. Можно даже сойти на пол-пути.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Господа, у него в ролике камера высоко летает. Как это сделать?

 

Vanity camera lock в Код патче.

 

Кстате о теме - Ривнрстрайдеры из ТР:

 

Изменено пользователем Colt17
Ссылка на комментарий
Поделиться на другие сайты

У меня русифицированный код патч, какая опция по-русски?

 

У Менорры спроси. Вроде она его переводила.

Ссылка на комментарий
Поделиться на другие сайты

Можно спросить: насколько играбеленсейчас этот мод? Много ли багов?

 

Стабильно без багов на дефолтном морровинде. Абот, кажется, еще учитывал плагины Вурта (деревья) и Валити7 (увеличение колчичесива деревьев на Аскадианских островах и Горьком берегу). С остальными плагинами значительно изменяющими ландшафт, могут быть проблемы.

Ссылка на комментарий
Поделиться на другие сайты

Проверил на репаке эла, пашет отлично. При прогулке от Сейда Нин до балморы единственный раз зацепил ветку, всё остальное шикарно.
Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

По поводу багов в лодках:

 

Кто скажет что означает настройка в настроечном скрипте Enable boat view bobbing? Вроде как за подскакивание камеры отвечает (наверное), но я что-то вообще никакой разницы не заметила что со включённым, что с отключённым этим боббингом.

 

У меня одной проблемы с освещением на борту и лампами в руках у shipmasters? Если включить освещение, оно начинает мерзко мигать. А если раздать капитанам лампы, то они их то держат, то не держат и вообще не понятно чем руководствуются. Вроде только что вот держал, а пока ты подходил к нему, фонарь исчез.

Ссылка на комментарий
Поделиться на другие сайты

По поводу багов в лодках:

 

Кто скажет что означает настройка в настроечном скрипте Enable boat view bobbing? Вроде как за подскакивание камеры отвечает (наверное), но я что-то вообще никакой разницы не заметила что со включённым, что с отключённым этим боббингом.

Хм, возможно эта настройка отвечает за покачивание/тряску лодки, имхо, для придачи атмосферности. Ну или автор что-то задумал но забыл исполнить. Но я могу и ошибаться.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...
Мод бесспорно хорош, но к сожалению я так и не смог насладиться им в полной мере. При поездке камера трясется как сумасшедшая, а любоваться красотами Ввандерфелла при землятрясении как то не очень. Плагинов изменяющих ландшафт или добавляющих новые объекты (как деревья) не стояло, и не стоит сейчас. Причин для спотыкания силт страйдеров не заметил. Возможно ли исправить эту проблему? Может есть новая версия плагина, где получше с движением страйдеров?
Ссылка на комментарий
Поделиться на другие сайты

Привет всем! Интересует, будет ли адаптация мода abotGondoliers и abotGuars? Моды от Abot просто улет, давно мечтал о реал-тайм поездках по TES3. Кстати, чтобы камера не лагала в атмосферных поездках, нужно поставить MCP
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Неплохо было бы добавить страйдеру способность защищаться от скальных наездников.

Как ты себе это представляешь!? Страйдеру то по идее наездники вообще по барабану должны быть. Что они ему через толстенный панцирь сделают!? Накакают разве что сверху.

Защищать должен в таком случае ... эээ... водитель.

Ссылка на комментарий
Поделиться на другие сайты

Риверстрайдеры бестолковая штука, а вот Силты - работают на 9/10. То есть немного есть проблем, но, учитывая что это казалось почти невозможным, сделано на удивление гладко.

 

 

Кстати, водичка абота - сайт-то закрылся... Для карт не ниже ати 6790 или 7750, нвидий не ниже 560 или 650ти. Если слабее, будут тормоза.

Позволяет выставить в mge xe примерно двойную высоту волн (60-90 вместо 30-45), сохраняя их приличный вид. Ну и красивее.

 

 

// XE Water.fx
// MGE XE 0.9
// Water functions (included by XE Main)
// changes by abot
//------------------------------------------------------------
// Samplers, clamping mode
sampler sampReflect = sampler_state { texture = <tex0>; minfilter = linear; magfilter = linear; mipfilter = none; addressu = clamp; addressv = clamp; };
sampler sampRefract = sampler_state { texture = <tex2>; minfilter = linear; magfilter = linear; mipfilter = none; addressu = clamp; addressv = clamp; };
//------------------------------------------------------------
// Water constants
static const float _lightfactor = 1 - pow(1 - SunVis, 2);
static const float3 _SunCollf = SunCol * _lightfactor;
//abot static const float3 _depthcolor = _SunCollf * float3(0.03, 0.04, 0.05) + (2 * SkyCol + FogCol2) * float3(0.075, 0.08, 0.085);
static const float3 _depthcolor = _SunCollf * float3(0.03, 0.04, 0.05) + (2 * SkyCol + FogCol2) * float3(0.0664, 0.0742, 0.0898/*RGB 17 19 23*/);
static const float _windfactor = (length (WindVec) + 1.5) / 140;
static const float _windfactor2 = ( length(WindVec) * 0.08 ) + 0.75; // abot
static const float waterlevel = world[3][2];
//abot static const float cauststr = 0.05 * alpharef * saturate(0.75 * _lightfactor + 0.35 * length(FogCol2));
static const float cauststr = 0.06 * alpharef * saturate(0.75 * _lightfactor + 0.35 * length(FogCol2));
shared texture tex4, tex5;
shared float3 rippleOrigin;
shared float waveHeight;
sampler sampRain = sampler_state { texture = <tex4>; minfilter = linear; magfilter = linear; mipfilter = linear; addressu = wrap; addressv = wrap; };
sampler sampWave = sampler_state { texture = <tex5>; minfilter = linear; magfilter = linear; mipfilter = linear; bordercolor = 0x80808080; addressu = border; addressv = border; };
static const float waveTexResolution = 512;
static const float waveTexWorldSize = waveTexResolution * 2.5;
static const float waveTexRcpRes = 1.0 / (waveTexResolution-1);
static const float playerWaveSize = 12.0 / waveTexWorldSize; // 12 world units radius
//------------------------------------------------------------
// Static functions
// to disable option, put // comment prefix in front of #
#define SEWER
//#define FOAM
#ifdef SEWER
// abot
// variation of harlanrm's Vivec and Molag Mar sewer waves
//Vivec sewer locations
static const float2 wLoc[62] = {
{ 19160, -86825},
{ 46500, -81930},
{ 31475, -104345},
{ 32165, -76700},
{ 19160, -81900},
{ 20260, -80775},
{ 20300, -87915},
{ 24125, -80775},
{ 24225, -87915},
{ 25275, -86700},
{ 25275, -81850},
{ 25550, -95230},
{ 25550, -91390},
{ 25550, -88840},
{ 25550, -84940},
{ 26300, -81750},
{ 26300, -77825},
{ 26630, -89955},
{ 26650, -96365},
{ 26700, -83850},
{ 27185, -90260},
{ 27625, -82800},
{ 27635, -76700},
{ 31180, -96925},
{ 31200, -103770},
{ 31540, -83850},
{ 31615, -96365},
{ 31765, -90260},
{ 31895, -89955},
{ 32150, -82800},
{ 32675, -95020},
{ 32675, -91785},
{ 32675, -88690},
{ 32675, -85300},
{ 32975, -95365},
{ 32975, -91190},
{ 32975, -89110},
{ 32975, -84720},
{ 33450, -81635},
{ 33450, -77945},
{ 34095, -96365},
{ 34120, -90260},
{ 34175, -104345},
{ 34480, -83850},
{ 34585, -89955},
{ 34640, -96925},
{ 34695, -103770},
{ 38500, -89955},
{ 38965, -96365},
{ 38980, -83850},
{ 39060, -90260},
{ 40100, -95300},
{ 40100, -91395},
{ 40100, -88790},
{ 40100, -84900},
{ 40400, -86900},
{ 40400, -81955},
{ 41350, -87915},
{ 41475, -80775},
{ 45300, -87915},
{ 45480, -80775},
{ 46500, -86790},
};
static const float2 wLoc2[8] = {
//Molag Mar
{ 107090, -63820},
{ 114215, -59905},
{ 113110, -64890},
{ 107090, -59875},
{ 108085, -58800},
{ 108110, -64890},
{ 113170, -58800},
{ 114215, -63780}
};
#endif
float3 getFinalWaterNormal(float2 texcoord1, float2 texcoord2, float dist, float2 vertXY) : NORMAL
{
// Calculate the W texture coordinate based on the time that has passed
//abot float t = 0.4 * time;
float t = 0.3 * time;
//abot float3 w1 = float3(texcoord1, t);
float3 w1 = float3(texcoord1, t * 0.56);
float3 w2 = float3(texcoord2, t);
 
// Blend together the normals from different sized areas of the same texture
float2 far_normal = tex3D(sampWater3d, w1).rg;
float2 close_normal = tex3D(sampWater3d, w2).rg;
#ifdef DYNAMIC_RIPPLES
// Add rain and player ripples
close_normal.rg += tex2D(sampRain, texcoord2).ba - 0.5;
close_normal.rg += tex2D(sampWave, (vertXY - rippleOrigin) / waveTexWorldSize).ba * 2 - 1;
#endif
#ifdef SEWER
//Add wave effect for each sewer location
if ( waterlevel == 0 ) {  // exterior
	if ( dist < 7168 ) {
		int i = 0;
		float ticksX = time*1.2;
		float d;
		float2 w;
		while ( i < 62 ) {
			w = wLoc[i];
			d = length(EyePos.xy-w);
			if ( d < 7168 ) {
				d = length(vertXY-w);
				if ( d < 1280 ) {
					close_normal.rg += sin(fmod(d,128)/20.371832716 - ticksX) / max((d*d)/20480,4);
				}
			}
			i++;
		}
		i = 0;
		while ( i < 8 ) {
			w = wLoc2[i];
			d = length(EyePos.xy-w);
			if ( d < 7168 ) {
				d = length(vertXY-w);
				if ( d < 1280 ) {
					close_normal.rg += sin(fmod(d,128)/20.371832716 - ticksX) / max((d*d)/20480,4);
				}
			}
			i++;
		}
	}
}
#endif
float2 normal_R = 2 * lerp(close_normal, far_normal, saturate(dist / 8000)) - 1;
return normalize(float3(normal_R, 1));
}
#ifndef FILTER_WATER_REFLECTION
float3 getProjectedReflection(float4 tex)
{
return tex2Dproj(sampReflect, tex).rgb;
}
#else
float3 getProjectedReflection(float4 tex)
{
float4 radius = 0.006 * saturate(0.11 + tex.w/6000) * tex.w * float4(1, rcpres.y/rcpres.x, 0, 0);
 
float3 reflected = tex2Dproj(sampReflect, tex);
reflected += tex2Dproj(sampReflect, tex + radius*float4(0.60, 0.10, 0, 0));
reflected += tex2Dproj(sampReflect, tex + radius*float4(0.30, -0.21, 0, 0));
reflected += tex2Dproj(sampReflect, tex + radius*float4(0.96, -0.03, 0, 0));
reflected += tex2Dproj(sampReflect, tex + radius*float4(-0.40, 0.06, 0, 0));
reflected += tex2Dproj(sampReflect, tex + radius*float4(-0.70, 0.18, 0, 0));
reflected /= 6.0;
 
return reflected.rgb;
}
#endif
//------------------------------------------------------------
// Water shader
struct WaterVertOut
{
float4 position : POSITION;
float4 pos : TEXCOORD0;
float4 texcoords : TEXCOORD1;
float4 screenpos : TEXCOORD2;
#ifdef DYNAMIC_RIPPLES
float4 screenposclamp : TEXCOORD3;
#endif
};
#ifndef DYNAMIC_RIPPLES
WaterVertOut WaterVS (in float4 pos : POSITION)
{
WaterVertOut OUT;
// Add z bias to avoid fighting with MW ripples quads
OUT.pos = mul(pos, world);
OUT.pos.z -= 0.1;
// Calculate various texture coordinates
OUT.texcoords.xy = OUT.pos.xy / 3900;
OUT.texcoords.zw = OUT.pos.xy / 527;
OUT.position = mul(OUT.pos, view);
OUT.position = mul(OUT.position, proj);
// Match bias in distant land projection
OUT.position.z *= 1.0 + 5e-6 * step(8192, OUT.position.w);
 
OUT.screenpos = float4(0.5 * (1 + rcpres) * OUT.position.w + float2(0.5, -0.5) * OUT.position.xy, OUT.position.zw);
return OUT;
}
#else
WaterVertOut WaterVS (in float4 pos : POSITION)
{
WaterVertOut OUT;
 
// Move to world space
OUT.pos = mul(pos, world);
// Calculate various texture coordinates
OUT.texcoords.xy = OUT.pos.xy / 3900;
//abot OUT.texcoords.zw = OUT.pos.xy / 527;
OUT.texcoords.zw = OUT.pos.xy / 1104;
// Apply vertex displacement
//abot float t = 0.4 * time;
float t = 0.3 * time;
//float height = tex3Dlod(sampWater3d, float4(OUT.texcoords.zw, t, 0)).a;
//float height2 = tex3Dlod(sampWater3d, float4(OUT.texcoords.xy, t, 0)).a;
float height = tex3Dlod(sampWater3d, float4(OUT.texcoords.zw, t, 0)).a;
float height2 = tex3Dlod(sampWater3d, float4(OUT.texcoords.xy, t*0.56, 0)).a;
float dist = length(EyePos.xyz - OUT.pos.xyz);
//abot float addheight = waveHeight * (lerp(height, height2, saturate(dist/8000)) - 0.5) * saturate(1 - dist/6400) * saturate(dist/200);
float addheight = _windfactor2 * waveHeight * (lerp(height, height2, saturate(dist/8000)) - 0.5 ) * saturate(1 - dist/6400) * saturate(dist/200);
 
 
OUT.pos.z += addheight;
// Match bias in distant land projection
OUT.position = mul(OUT.pos, view);
OUT.position = mul(OUT.position, proj);
OUT.position.z *= 1.0 + 5e-6 * step(8192, OUT.position.w);
OUT.screenpos = float4(0.5 * (1 + rcpres) * OUT.position.w + float2(0.5, -0.5) * OUT.position.xy, OUT.position.zw);
// Clamp reflection point to be above surface
float4 clampedPos = OUT.pos - float4(0, 0, abs(addheight), 0);
clampedPos = mul(clampedPos, view);
clampedPos = mul(clampedPos, proj);
clampedPos.z *= 1.0 + 5e-6 * step(8192, clampedPos.w);
OUT.screenposclamp = float4(0.5 * (1 + rcpres) * clampedPos.w + float2(0.5, -0.5) * clampedPos.xy, clampedPos.zw);
 
return OUT;
}
#endif
float4 WaterPS(in WaterVertOut IN): COLOR0
{
// Calculate eye vector
float3 EyeVec = IN.pos.xyz - EyePos.xyz;
float dist = length(EyeVec);
EyeVec /= dist;
// Define fog
float4 fog = fogColour(EyeVec, dist);
float3 depthcolor = fogApply(_depthcolor, fog);
 
// Calculate water normal
float3 normal = getFinalWaterNormal(IN.texcoords.xy, IN.texcoords.zw, dist, IN.pos.xy);
// Reflection/refraction pixel distortion factor, wind strength increases distortion
float2 reffactor = (_windfactor * dist + 0.1) * normal.xy;
// Distort refraction dependent on depth
float4 newscrpos = IN.screenpos + float4(reffactor.yx, 0, 0);
float depth = max(0, tex2Dproj(sampDepth, newscrpos).r - IN.screenpos.w);
// Refraction
float3 refracted = depthcolor;
float shorefactor = 0;
#ifdef FOAM
float foam = 0;
#endif
// Avoid sampling deep water
if(depth < 4000)
{
	// Sample refraction texture
	newscrpos = IN.screenpos + saturate(depth / 100) * float4(reffactor.yx, 0, 0);
	refracted = tex2Dproj(sampRefract, newscrpos).rgb;
	// Get distorted depth
	depth = max(0, tex2Dproj(sampDepth, newscrpos).r - IN.screenpos.w);
	depth /= dot(EyeVec, float3(view[0][2], view[1][2], view[2][2]));
	// Small scale shoreline animation
	float wave = 300 * (0.95 - normal.z);
	depth += wave;
	//abot float depthscale = saturate(exp(-depth / 800));
	float depthscale = saturate(exp(-depth / 1100));
	shorefactor = pow(depthscale, 90);
//begin abot
#ifdef FOAM
	float foamfactor = pow(depthscale, 25);
	if ( SunVis >= 0.001 ) {
		foam = saturate(wave*0.005);
		foam += saturate( -5*pow(foamfactor - 0.5,1.3) + 1) * 0.5;
		foam = saturate(foam);
		//float2 foam_map = ( IN.pos.xy % 400 ) / 100;
		float2 foam_map = ( IN.pos.xy % 300 ) / 100;
		float3 foam_col = tex3D(sampWater3d, float3(foam_map,time*0.2));
		float foam_mult = foam_col.b * 0.4 + foam_col.r * 0.3 + foam_col.g * 0.3;
		if (foam_mult > (1-foam)) {
			foam *= foam_mult;
		}
		else {
			foam *= foam_mult/3;
		}
	}
#endif
// end abot
	// Make transition between actual refraction image and depth color depending on water depth
	refracted = lerp(depthcolor, refracted, 0.8 * depthscale + 0.2 * shorefactor);
}
 
// Sample reflection texture
#ifndef DYNAMIC_RIPPLES
float4 screenpos = IN.screenpos;
#else
float4 screenpos = IN.screenposclamp;
#endif
//abot float3 reflected = getProjectedReflection(screenpos - float4(2.1 * reffactor.x, -abs(reffactor.y), 0, 0));
float3 reflected = getProjectedReflection(screenpos - float4(1.9 * reffactor.x, -abs(reffactor.y), 0, 0));
// Dull reflection to avoid being too bright relative to sky,
// except for fading into an inscatter dominated horizon
reflected *= 1 - 0.16 * saturate(2 * fog.a);
// Smooth out high frequencies at a distance
float3 adjustnormal = lerp(float3(0, 0, 0.1), normal, pow(saturate(1.05 * fog.a), 2));
adjustnormal = lerp(adjustnormal, float3(0, 0, 1.0), (1 + EyeVec.z) * (1 - saturate(1 / (dist / 1000 + 1))));
// Fresnel equation determines reflection/refraction
float fresnel = dot(-EyeVec, adjustnormal);
fresnel = 0.02 + pow(saturate(0.9988 - 0.28 * fresnel), 16);
float3 result = lerp(refracted, reflected, fresnel);
 
// Specular lighting
// This should use Blinn-Phong, but it doesn't work so well for area lights like the sun
// Instead multiply and saturate to widen a Phong specular lobe which better simulates an area light
float vdotr = dot(-EyeVec, reflect(-SunPos, normal));
vdotr = saturate(1.0025 * vdotr);
float3 spec = _SunCollf * (pow(vdotr, 170) + 0.07 * pow(vdotr, 4));
result += spec * fog.a;
#ifdef FOAM
result += foam * saturate(SkyCol.b);
#endif
// Smooth transition at shore line
result = lerp(result, refracted, shorefactor * fog.a);
 
// Note that both refraction and reflection textures were rendered fogged already
 
return float4(result, 1);
}
float4 UnderwaterPS(in WaterVertOut IN): COLOR0
{
// Calculate eye vector
float3 EyeVec = IN.pos.xyz - EyePos.xyz;
float dist = length(EyeVec);
EyeVec /= dist;
// Special case fog, avoid fog offset
float fog = saturate(exp(-dist / 4096));
 
// Calculate water normal
float3 normal = -getFinalWaterNormal(IN.texcoords.xy, IN.texcoords.zw, dist, IN.pos.xy);
// Reflection / refraction pixel distortion factor, wind strength increases distortion
float2 reffactor = 2 * (_windfactor * dist + 0.1) * normal.xy;
// Distort refraction
float4 newscrpos = IN.screenpos + float4(2 * -reffactor.xy, 0, 0);
float3 refracted = tex2Dproj(sampRefract, newscrpos).rgb;
refracted = lerp(FogCol2, refracted, exp(-dist / 500));
// Sample reflection texture
//abot float3 reflected = getProjectedReflection(IN.screenpos - float4(2.1 * reffactor.x, -abs(reffactor.y), 0, 0));
float3 reflected = getProjectedReflection(IN.screenpos - float4(1.9 * reffactor.x, -abs(reffactor.y), 0, 0));
// Fresnel equation, including total internal reflection
float fresnel = pow(saturate(1.12 - 0.65 * dot(-EyeVec, normal)), 8);
float3 result = lerp(refracted, reflected, fresnel);
// Sun refraction
float refractsun = dot(-EyeVec, normalize(-SunPos + normal));
float3 spec = _SunCollf * pow(refractsun, 6) * fog;
return float4(result + spec, 1);
}
//------------------------------------------------------------
// Caustics post-process
DeferredOut CausticsVS (float4 pos : POSITION, float2 tex : TEXCOORD0, float2 ndc : TEXCOORD1)
{
DeferredOut OUT;
 
// Fix D3D9 half pixel offset  
OUT.pos = float4(ndc.x - rcpres.x, ndc.y + rcpres.y, 0, 1);
OUT.tex = float4(tex, 0, 0);
 
// World space reconstruction vector
OUT.eye = float3(view[0][2], view[1][2], view[2][2]);
OUT.eye += (ndc.x / proj[0][0]) * float3(view[0][0], view[1][0], view[2][0]);
OUT.eye += (ndc.y / proj[1][1]) * float3(view[0][1], view[1][1], view[2][1]);
return OUT;
}
float4 CausticsPS (DeferredOut IN) : COLOR0
{
float3 c = tex2Dlod(sampBaseTex, IN.tex).rgb;
float depth = tex2Dlod(sampDepth, IN.tex).r;
float fog = fogMWScalar(depth);
clip(7168.0 - depth);
float3 uwpos = EyePos + IN.eye * depth;
uwpos.z -= waterlevel;
clip(-uwpos.z);
float3 sunray = uwpos - SunVec * (uwpos.z / SunVec.z);
//abot float caust = cauststr * tex3D(sampWater3d, float3(sunray.xy / 1104, 0.4 * time)).b;
float caust = cauststr * tex3D(sampWater3d, float3(sunray.xy / 1104, 0.3 * time)).b;
caust *= saturate(125 / depth * min(fwidth(sunray.x), fwidth(sunray.y)));
c *= 1 + (caust - 0.3) * saturate(exp(uwpos.z / 400)) * saturate(uwpos.z / -30) * fog;
 
return float4(c, 1);
}

//------------------------------------------------------------
// Dynamic waves
struct WaveVertOut
{
float4 pos : POSITION;
float2 texcoord : TEXCOORD0;
};
WaveVertOut WaveVS (float4 pos : POSITION, float2 texcoord : TEXCOORD0)
{
WaveVertOut OUT;
OUT.pos = mul(pos, proj);
OUT.texcoord = texcoord;
return OUT;
}
//------------------------------------------------------------
float4 WaveStepPS (float2 Tex : TEXCOORD0) : COLOR0
{
float4 c = 2 * tex2D(sampRain, Tex) - 1;
float4 ret = {0, c.r, 0, 0};
 
float4 n = {
	tex2D(sampRain, Tex + float2(waveTexRcpRes, 0)).r,
	tex2D(sampRain, Tex + float2(-waveTexRcpRes, 0)).r,
	tex2D(sampRain, Tex + float2(0, waveTexRcpRes)).r,
	tex2D(sampRain, Tex + float2(0, -waveTexRcpRes)).r
};
float4 n2 = {
	tex2D(sampRain, Tex + float2(1.5 * waveTexRcpRes, 0)).r,
	tex2D(sampRain, Tex + float2(-1.5 * waveTexRcpRes, 0)).r,
	tex2D(sampRain, Tex + float2(0, 1.5 * waveTexRcpRes)).r,
	tex2D(sampRain, Tex + float2(0, -1.5 * waveTexRcpRes)).r
};
 
// expand normal
n = 2 * n - 1;
 
// dampened discrete two-dimensional wave equation
// red channel: u(t)
// green channel: u(t - 1)
// u(t + 1) = (1 - udamp) * u(t) + a * (nsum - 4 * u(t)) + (1 - vdamp) * (u(t) - u(t - 1))
//		= a * nsum + ((2 - udamp - vdamp) - 4 * a) * u(t) - (1 - vdamp) * u(t - 1);
float nsum = n.x + n.y + n.z + n.w;
ret.r = 0.14 * nsum + (1.96 - 0.56) * c.r - 0.98 * c.g;
 
// calculate normal map
ret.ba = 2 * (n.xy - n.zw) + (n2.xy - n2.zw);
ret = 0.5 * ret + 0.5;
 
return ret;
}
float4 PlayerWavePS (float2 Tex : TEXCOORD0) : COLOR0
{
float4 ret = tex2D(sampRain, Tex);
float wavesize = (1.0 + 0.055 * sin(16 * time) + 0.065 * sin(12.87645 * time)) * playerWaveSize;
ret.rg *= saturate(2 * abs(length(Tex - rippleOrigin) / wavesize - 1));
return ret;
}

 

 

Ссылка на комментарий
Поделиться на другие сайты

Гм. А чем риверстрайдеры не угодили? Мне понравилось. Плывёшь себе, кайфуешь.

 

Водичку от Абота сразу не советую всем, у кого ТР. Там во многих местах ландшафт очень низко - даже обычные волны сквозь землю просвечивают.

Ссылка на комментарий
Поделиться на другие сайты

Лорность под вопросом, смотрятся неуклюже, а лодки есть и так.

 

Эта версия воды не заставляет делать волны выше. Можно оставить и как есть.

Объясняю ситуацию: MGE-XE масштабирует волны по вертикали, но не по горизонтали. Реальные волны имеют соотношение длина:высота около 20:1. Что-то около 8:1, как в MGE с низкими волнами, ещё не режет глаз. Меньше режет. Волны в версии абота сделаны лучше и дают приемлемое соотношение даже при большей высоте. Можно поставить и 15-20 - тогда они будут просто получше, но не выше, как раз кстати будет близко к 1:20.

Ссылка на комментарий
Поделиться на другие сайты

Лорность под вопросом, смотрятся неуклюже, а лодки есть и так.

Чужеродно они не выглядят, а модельки, да, очень так себе.

 

Эта версия воды не заставляет делать волны выше. Можно оставить и как есть.

Объясняю ситуацию: MGE-XE масштабирует волны по вертикали, но не по горизонтали. Реальные волны имеют соотношение длина:высота около 20:1. Что-то около 8:1, как в MGE с низкими волнами, ещё не режет глаз. Меньше режет. Волны в версии абота сделаны лучше и дают приемлемое соотношение даже при большей высоте. Можно поставить и 15-20 - тогда они будут просто получше, но не выше, как раз кстати будет близко к 1:20.

Раз так, надо будет попробовать.
Ссылка на комментарий
Поделиться на другие сайты

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

Поэтому можно сохранить выше как xe water.hq и поставить такой батник в морровинд для переключения:

 

cd "Data Files"
cd Shaders
if exist hq (
 copy "XE Water.def" "XE Water.fx"
 ren hq lq
) else (
 if not exist "XE Water.def" copy "XE Water.fx" "XE Water.def"
 copy "XE Water.hq" "XE Water.fx"
 ren lq hq
 if not exist hq echo q>hq
)
cd %~dp0
start mgexegui

 

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

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

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