Elderanon Опубликовано 29 января, 2012 Жалоба Поделиться Опубликовано 29 января, 2012 Ну, теперь осталось сделать рыбаков, которые плывут на глубину, а не просто стоят на лодках (как в моде с расписаниями) и снующих между городами/по морю/по реке людей на гуарах, силт-страйдерах, лодках, кораблях. Не часто, конечно же, а так, за день парочку в разных частях Морровинда, к примеру. И Морровинд оживет.А потом можно будет реализовать торговлю между городами. То есть, к примеру, появился погонщик гуаров из Кальдеры в Сейда Нин - всё, теперь у Арилла, к примеру, можно купить что-нибудь новое. И так далее. Так что простор для интерактивности открыт. Ссылка на комментарий Поделиться на другие сайты Поделиться
ShadowMimicry Опубликовано 19 февраля, 2012 Жалоба Поделиться Опубликовано 19 февраля, 2012 (изменено) Интересно а в моде есть возможность при желании пропустить поездку?) если нету, и если это возможно, надо бы разработчику её прикрутить) а то это конечно весело и атмосферно, вот так вот ездить) но не всегда хочется тратить кучу времен на это)Немного оффтопа... А на последнем видео от Марка, это что там континентальная часть от TR ? а то, что то она как то больно близка к Солстхейму Изменено 19 февраля, 2012 пользователем ShadowMimicry Ссылка на комментарий Поделиться на другие сайты Поделиться
Scarab-Phoenix Опубликовано 19 февраля, 2012 Жалоба Поделиться Опубликовано 19 февраля, 2012 Немного оффтопа... А на последнем видео от Марка, это что там континентальная часть от TR ? а то, что то она как то больно близка к СолстхеймуДа. Ссылка на комментарий Поделиться на другие сайты Поделиться
Муурн Шепард Опубликовано 19 февраля, 2012 Жалоба Поделиться Опубликовано 19 февраля, 2012 Интересно а в моде есть возможность при желании пропустить поездку?)Есть, ковыряйся в опциях. Ссылка на комментарий Поделиться на другие сайты Поделиться
Siberian Crab Опубликовано 19 февраля, 2012 Автор Жалоба Поделиться Опубликовано 19 февраля, 2012 Интересно а в моде есть возможность при желании пропустить поездку? Так активируй страйдер пробелом и будет счастье. Можно даже сойти на пол-пути. Ссылка на комментарий Поделиться на другие сайты Поделиться
Вевик Опубликовано 2 марта, 2012 Жалоба Поделиться Опубликовано 2 марта, 2012 Господа, у него в ролике камера высоко летает. Как это сделать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Siberian Crab Опубликовано 2 марта, 2012 Автор Жалоба Поделиться Опубликовано 2 марта, 2012 (изменено) Господа, у него в ролике камера высоко летает. Как это сделать? Vanity camera lock в Код патче. Кстате о теме - Ривнрстрайдеры из ТР: Изменено 2 марта, 2012 пользователем Colt17 Ссылка на комментарий Поделиться на другие сайты Поделиться
Вевик Опубликовано 3 марта, 2012 Жалоба Поделиться Опубликовано 3 марта, 2012 Vanity camera lock в Код патче.У меня русифицированный код патч, какая опция по-русски? Ссылка на комментарий Поделиться на другие сайты Поделиться
Siberian Crab Опубликовано 3 марта, 2012 Автор Жалоба Поделиться Опубликовано 3 марта, 2012 У меня русифицированный код патч, какая опция по-русски? У Менорры спроси. Вроде она его переводила. Ссылка на комментарий Поделиться на другие сайты Поделиться
Wonterone Опубликовано 4 марта, 2012 Жалоба Поделиться Опубликовано 4 марта, 2012 Можно спросить: насколько играбеленсейчас этот мод? Много ли багов? Ссылка на комментарий Поделиться на другие сайты Поделиться
Siberian Crab Опубликовано 4 марта, 2012 Автор Жалоба Поделиться Опубликовано 4 марта, 2012 Можно спросить: насколько играбеленсейчас этот мод? Много ли багов? Стабильно без багов на дефолтном морровинде. Абот, кажется, еще учитывал плагины Вурта (деревья) и Валити7 (увеличение колчичесива деревьев на Аскадианских островах и Горьком берегу). С остальными плагинами значительно изменяющими ландшафт, могут быть проблемы. Ссылка на комментарий Поделиться на другие сайты Поделиться
Wonterone Опубликовано 4 марта, 2012 Жалоба Поделиться Опубликовано 4 марта, 2012 А с рапаком Эла без конфликтов пойдёт? Ссылка на комментарий Поделиться на другие сайты Поделиться
Siberian Crab Опубликовано 4 марта, 2012 Автор Жалоба Поделиться Опубликовано 4 марта, 2012 А с рапаком Эла без конфликтов пойдёт? Попробуй, я не знаю. Ссылка на комментарий Поделиться на другие сайты Поделиться
Wonterone Опубликовано 4 марта, 2012 Жалоба Поделиться Опубликовано 4 марта, 2012 Проверил на репаке эла, пашет отлично. При прогулке от Сейда Нин до балморы единственный раз зацепил ветку, всё остальное шикарно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Menorra Опубликовано 27 июля, 2012 Жалоба Поделиться Опубликовано 27 июля, 2012 По поводу багов в лодках: Кто скажет что означает настройка в настроечном скрипте Enable boat view bobbing? Вроде как за подскакивание камеры отвечает (наверное), но я что-то вообще никакой разницы не заметила что со включённым, что с отключённым этим боббингом. У меня одной проблемы с освещением на борту и лампами в руках у shipmasters? Если включить освещение, оно начинает мерзко мигать. А если раздать капитанам лампы, то они их то держат, то не держат и вообще не понятно чем руководствуются. Вроде только что вот держал, а пока ты подходил к нему, фонарь исчез. Ссылка на комментарий Поделиться на другие сайты Поделиться
Moran Remar Опубликовано 28 июля, 2012 Жалоба Поделиться Опубликовано 28 июля, 2012 По поводу багов в лодках: Кто скажет что означает настройка в настроечном скрипте Enable boat view bobbing? Вроде как за подскакивание камеры отвечает (наверное), но я что-то вообще никакой разницы не заметила что со включённым, что с отключённым этим боббингом.Хм, возможно эта настройка отвечает за покачивание/тряску лодки, имхо, для придачи атмосферности. Ну или автор что-то задумал но забыл исполнить. Но я могу и ошибаться. Ссылка на комментарий Поделиться на другие сайты Поделиться
Maks Mazuro Опубликовано 29 ноября, 2012 Жалоба Поделиться Опубликовано 29 ноября, 2012 Мод бесспорно хорош, но к сожалению я так и не смог насладиться им в полной мере. При поездке камера трясется как сумасшедшая, а любоваться красотами Ввандерфелла при землятрясении как то не очень. Плагинов изменяющих ландшафт или добавляющих новые объекты (как деревья) не стояло, и не стоит сейчас. Причин для спотыкания силт страйдеров не заметил. Возможно ли исправить эту проблему? Может есть новая версия плагина, где получше с движением страйдеров? Ссылка на комментарий Поделиться на другие сайты Поделиться
Esh Опубликовано 4 декабря, 2012 Жалоба Поделиться Опубликовано 4 декабря, 2012 Привет всем! Интересует, будет ли адаптация мода abotGondoliers и abotGuars? Моды от Abot просто улет, давно мечтал о реал-тайм поездках по TES3. Кстати, чтобы камера не лагала в атмосферных поездках, нужно поставить MCP Ссылка на комментарий Поделиться на другие сайты Поделиться
LSerg Опубликовано 7 декабря, 2012 Жалоба Поделиться Опубликовано 7 декабря, 2012 Неплохо было бы добавить страйдеру способность защищаться от скальных наездников. Ссылка на комментарий Поделиться на другие сайты Поделиться
Maks Mazuro Опубликовано 18 декабря, 2012 Жалоба Поделиться Опубликовано 18 декабря, 2012 Неплохо было бы добавить страйдеру способность защищаться от скальных наездников.Как ты себе это представляешь!? Страйдеру то по идее наездники вообще по барабану должны быть. Что они ему через толстенный панцирь сделают!? Накакают разве что сверху.Защищать должен в таком случае ... эээ... водитель. Ссылка на комментарий Поделиться на другие сайты Поделиться
Varg Опубликовано 18 декабря, 2012 Жалоба Поделиться Опубликовано 18 декабря, 2012 Риверстрайдеры бестолковая штука, а вот Силты - работают на 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; } Ссылка на комментарий Поделиться на другие сайты Поделиться
Марк К. Марцелл Опубликовано 18 декабря, 2012 Жалоба Поделиться Опубликовано 18 декабря, 2012 Гм. А чем риверстрайдеры не угодили? Мне понравилось. Плывёшь себе, кайфуешь. Водичку от Абота сразу не советую всем, у кого ТР. Там во многих местах ландшафт очень низко - даже обычные волны сквозь землю просвечивают. Ссылка на комментарий Поделиться на другие сайты Поделиться
Varg Опубликовано 18 декабря, 2012 Жалоба Поделиться Опубликовано 18 декабря, 2012 Лорность под вопросом, смотрятся неуклюже, а лодки есть и так. Эта версия воды не заставляет делать волны выше. Можно оставить и как есть.Объясняю ситуацию: MGE-XE масштабирует волны по вертикали, но не по горизонтали. Реальные волны имеют соотношение длина:высота около 20:1. Что-то около 8:1, как в MGE с низкими волнами, ещё не режет глаз. Меньше режет. Волны в версии абота сделаны лучше и дают приемлемое соотношение даже при большей высоте. Можно поставить и 15-20 - тогда они будут просто получше, но не выше, как раз кстати будет близко к 1:20. Ссылка на комментарий Поделиться на другие сайты Поделиться
Марк К. Марцелл Опубликовано 19 декабря, 2012 Жалоба Поделиться Опубликовано 19 декабря, 2012 Лорность под вопросом, смотрятся неуклюже, а лодки есть и так.Чужеродно они не выглядят, а модельки, да, очень так себе. Эта версия воды не заставляет делать волны выше. Можно оставить и как есть.Объясняю ситуацию: MGE-XE масштабирует волны по вертикали, но не по горизонтали. Реальные волны имеют соотношение длина:высота около 20:1. Что-то около 8:1, как в MGE с низкими волнами, ещё не режет глаз. Меньше режет. Волны в версии абота сделаны лучше и дают приемлемое соотношение даже при большей высоте. Можно поставить и 15-20 - тогда они будут просто получше, но не выше, как раз кстати будет близко к 1:20.Раз так, надо будет попробовать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Varg Опубликовано 19 декабря, 2012 Жалоба Поделиться Опубликовано 19 декабря, 2012 В расширенную часть тамриэля обычно заходят надолго, потом обратно, между ними каждую минуту не перемещаются.Поэтому можно сохранить выше как 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти