|
Re: G3: Community Patch v1.7 (Исправляем G3)
По мотивам своего давнишнего поста:
Цитата:
Сообщение от Corvin666 link=board=gothic&t=1164204481&goto=4897552 date=03/31/09, в 05:32:37
<много всякого об улучшении графики>
|
сообщаю, что немного подолбавшись с шейдерами, пришел к выводу, что скорее всего причина пропавшей воды в океане на последней картинке в том, что движком перестает создаваться depth map для текстуры воды, начиная с какого-то, похоже, зашитого в движке, расстояния. В результате, глубина начиная с этого расстояния считается нулем, из-за чего мы и видим лажу. Тщательно изучив шейдер для воды в океане и наэкспериментировавшись с ним, я понял, что там все запущено, завязано на переменных из движка, без комментариев, и вообще, требует знаний о том, как пишутся подобные вещи. Поэтому меня хватило на одну правку, которая не решает полностью проблему уродского океана, но заставляет все выглядеть все же несколько приличней: На этом решил, что больше сделать не смогу. Вот код исправленного шейдера:
Cпойлер(щелкните, чтобы прочесть):
//************************************************** **************************** ************ //* //* File: * * * * * * * * *ge_ocean_3_0.fx * * * * * *(Version 2.0) //* //************************************************** **************************** ************ //* //* *Copyright (c) 2006 Pluto 13 GmbH / Piranha Bytes //* *All rights reserved. //* //************************************************** **************************** ************ //* //* History: //* //* 07/02/2006 | 1.00 * * *## Initial release * * * * * * * * * * * * * * * * * * * * * * * * * * *(kp) * * * * * *## //* //************************************************** **************************** ************
// //----------------------------------------------------------------------------- PREPROCESSOR //
#ifndef WIN32
// //----------------------------------------------------------------------------- DEPENDENCIES //
#ifdef XFX_PS_STATICBUMPMAP * * *#ifndef XFX_TANGENTSPACE * * * * * *#define XFX_TANGENTSPACE 1 * * *#endif // XFX_TANGENTSPACE #endif //XFX_PS_STATICBUMPMAP
#ifdef XFX_PS_FLOWINGBUMPMAP * * *#ifndef XFX_TANGENTSPACE * * * * * *#define XFX_TANGENTSPACE 1 * * *#endif // XFX_TANGENTSPACE #endif //XFX_PS_FLOWINGBUMPMAP
#include "ge_globals.fx"
#define XFX_PS_TEX0 input.vTex0.xy #define XFX_PS_TEX1 input.vTex1.xy #define XFX_PS_TEX2 input.vTex0.zw #define XFX_PS_TEX3 input.vTex1.zw
#define XFX_PS_VERTEXCOLOR input.vDiff
#ifndef XFX_VS_TEX0 * * *#define XFX_VS_TEX0 XFX_VS_INPUT_TEX0 #endif // XFX_VS_TEX0
#ifndef XFX_VS_TEX1 * * *#define XFX_VS_TEX1 XFX_VS_INPUT_TEX0 #endif // XFX_VS_TEX1
#ifndef XFX_VS_TEX2 * * *#define XFX_VS_TEX2 XFX_VS_INPUT_TEX0 #endif // XFX_VS_TEX2
#ifndef XFX_VS_TEX3 * * *#define XFX_VS_TEX3 XFX_VS_INPUT_TEX0 #endif // XFX_VS_TEX3
#ifdef XFX_SPECULAR * * *#ifndef XFX_PS_SPECULARPOWER * * * * * *#define XFX_PS_SPECULARPOWER 0.5f * * *#endif // XFX_PS_SPECULARPOWER #endif //XFX_SPECULAR
// //------------------------------------------------------------------------- GLOBAL VARIABLES //
float4 * * * * * * * * * * * * * * *vecWaterConstants; * * * * * * * * *// (1.0f-fFresnelConstant, fFresnelConstant, fShoreFadingScale, fDiffuseStrength) float4 * * * * * * * * * * * * * * *colReflectionModulate; float4 * * * * * * * * * * * * * * *vecDepthColorHalfLife; float4x4 * * * * * * * * * * * *matView; float4x4 * * * * * * * * * * * *matProjection;
#ifdef XFX_SPECULAR * * * * * *#ifdef XFX_PS_SPECULAR * * * * * * * * *SDirectionalLight * * * * * *DirLight;
* * *#endif //XFX_PS_SPECULAR
#endif //XFX_SPECULAR
#ifdef XFX_PS_DISTORTION
* * *sampler2D * * *smpRefract; * * *float4 * * * * * *vecVPosToRefractmap; * * * #endif //XFX_PS_DISTORTION
sampler2D smpDepthMap;
// // *SHADER CONSTANT MACRO // // *THIS IS NEEDED TO PUT IN ALL CONSTANTS DEFINED BY SHADER ELLEMENTS // #ifdef XFX_SHADER_CONSTANTS
* * *XFX_SHADER_CONSTANTS * * * #endif // XFX_SHADER_CONSTANTS
// //------------------------------------------------------------------------------ --- SHADERS //
struct VS_OUTPUT_3_0 { * * *float4 vPos * * * * * * * * * * * * * * *: POSITION; * * * * * *// Position
* * *#ifndef XFX_ZPASS * * * * * * * * *float4 vDiff * * * * * * * * * * * *: COLOR0; * * * * * *// Blend component for alpha blend stage mixing * * * * * *float3 vSpec * * * * * * * * * * * *: COLOR1; * * * * * *// Specular color * * * * * *float4 vTex0 * * * * * * * * * * * *: TEXCOORD0; * * *// Texture coordinate set 0 (in .xy) and 2 (in .zw)] * * * * * *float4 vTex1 * * * * * * * * * * * *: TEXCOORD1; * * *// Texture coordinate set 1 (in .xy) and 3 (in .zw)] * * * * * *float4 vEyeNormal * * * * * * * * *: TEXCOORD2; * * *// Normalized eye vector and eye depth * * * * * *float3 vFaceNormal * * * * * * * * *: TEXCOORD3; * * *// Face normal vector * * * * * * * * * * * *#ifdef XFX_TANGENTSPACE * * * * * * * * * * * * * * *float3 vFaceTangent * * * * * *: TEXCOORD4; * * *// Face tangent vector * * * * * * * * * * * * * * *#endif //XFX_TANGENTSPACE
* * * * * *float4 * * *vDepthMapAndDepth * * *: TEXCOORD5; * * * * * *float * vFog * * * * * * * * * * * *: TEXCOORD6; * * *// Fog value * * * * * *#else * * * * * * * * *#ifdef XFX_SPECIALDEPTHPASS
* * * * * * * * *float * * *vDepth * * *: TEXCOORD0;
* * * * * *#endif // XFX_SPECIALDEPTHPASS * * * * * *#endif * * *//XFX_ZPASS };
struct PS_INPUT_3_0 { * * *float2 vPos * * * * * * * * * * * * * * * * * *: VPOS; * * * * * * * * *// Position
* * *#ifndef XFX_ZPASS * * * * * * * * *float4 vDiff * * * * * * * * * * * *: COLOR0; * * * * * *// Blend component for alpha blend stage mixing * * * * * *float3 vSpec * * * * * * * * * * * *: COLOR1; * * * * * *// Specular color * * * * * *float4 vTex0 * * * * * * * * * * * *: TEXCOORD0; * * *// Texture coordinate set 0 (in .xy) and 2 (in .zw)] * * * * * *float4 vTex1 * * * * * * * * * * * *: TEXCOORD1; * * *// Texture coordinate set 1 (in .xy) and 3 (in .zw)] * * * * * *float4 vEyeNormal * * * * * * * * *: TEXCOORD2; * * *// Normalized eye vector and eye depth * * * * * *float3 vFaceNormal * * * * * * * * *: TEXCOORD3; * * *// Face normal vector * * * * * * * * * * * *#ifdef XFX_TANGENTSPACE * * * * * * * * * * * * * * *float3 vFaceTangent * * * * * *: TEXCOORD4; * * *// Face tangent vector * * * * * * * * * * * * * * *#endif //XFX_TANGENTSPACE
* * * * * *float4 * * *vDepthMapAndDepth * * *: TEXCOORD5; * * * * * *float * vFog * * * * * * * * * * * *: TEXCOORD6; * * *// Fog value
* * *#else * * * * * * * * *#ifdef XFX_SPECIALDEPTHPASS
* * * * * * * * *float * * *vDepth * * *: TEXCOORD0;
* * * * * *#endif // XFX_SPECIALDEPTHPASS * * * * * *#endif * * *//XFX_ZPASS };
#ifdef XFX_VS
//************************************************** ************************* // * * *VERTEXSHADER VS // * * *Default vertex for sv 3_0 //************************************************** ************************* VS_OUTPUT_3_0 VS( const VS_INPUT input ) { * * *VS_OUTPUT_3_0 output = (VS_OUTPUT_3_0)0;
* * *#ifdef XFX_ZPASS
* * * * * *// * * * * * *// *LOCALS * * * * * *// * * * * * *float3 vecWorldPosition; * * * * * *Transform( input, vecWorldPosition );
* * * * * *#ifdef XFX_SPECIALDEPTHPASS
* * * * * * * * *float4 vecProjectedPos ** * * * * *= mul( float4( vecWorldPosition, 1.0f ), matViewProjection ); * * * * * * * * *output.vPos * * * * * * * * * * * * * * *= vecProjectedPos; * * * * * * * * * * * * * * * * * * * * *output.vDepth * * * * * * * * * * * *= vecProjectedPos.w * 0.0001f;
* * * * * *#else // XFX_SPECIALDEPTHPASS
* * * * * * * * *output.vPos = mul( float4( vecWorldPosition, 1.0f ), matViewProjection );
* * * * * *#endif // else XFX_SPECIALDEPTHPASS * * * * * * * * * * * * * * *#else //XFX_ZPASS
* * * * * *// * * * * * *// *LOCALS * * * * * *// * * * * * *float3 vecWorldPosition; * * * * * *float3 vecWorldNormal; * * * * * * * * * * * *#ifdef XFX_TANGENTSPACE * * * * * * * * * * * * * * *float3 vecWorldTangent; * * * * * * * * *float3 vecWorldBiNormal; * * * * * * * * * * * * * * *#endif //XFX_TANGENTSPACE * * * * * * * * * * * * * * * * * * * * * * * *// * * * * * *// *TRANSFORM VERTICES * * * * * *// * * * * * *#ifdef XFX_TANGENTSPACE * * * * * * * * * * * * * * *Transform( input, vecWorldPosition, vecWorldNormal, vecWorldTangent, vecWorldBiNormal ); * * * * * * * * * * * * * * *#else //XFX_TANGENTSPACE * * * * * * * * * * * * * * *Transform( input, vecWorldPosition, vecWorldNormal ); * * * * * * * * * * * * * * *#endif //XFX_TANGENTSPACE * * * * * * * * * * * * * * * * * * * * *// * * * * * *// *EYE VECTOR & LENGTH * * * * * *// * * * * * *float3 vecEye * * * * * * * * *= vecCamPos - vecWorldPosition ; * * * * * *float *fRcpEyeLength * * *= rsqrt( dot( vecEye, vecEye ) ); * * * * * * * * * * * * * * * * * * * * * * * *// * * * * * *// *TEX COORDS * * * * * *// * * * * * *output.vTex0.xy = XFX_VS_TEX0; * * * * * *output.vTex1.xy = XFX_VS_TEX1; * * * * * *output.vTex0.zw = XFX_VS_TEX2; * * * * * *output.vTex1.zw = XFX_VS_TEX3; * * * * * * * * * * * * * * * * * *// * * * * * *// *FILL OUTPUT * * * * * *// * * * * * *float4 vecProjectedPos ** * * * * *= mul( float4( vecWorldPosition, 1.0f ), matViewProjection ); * * * * * *output.vPos * * * * * * * * * * * * * * *= vecProjectedPos; * * * * * *output.vDiff * * * * * * * * * * * *= input.vCol0; * * * * * *output.vFog * * * * * * * * * * * * * * *= CalcRadialFog( 1.0f / fRcpEyeLength ); * * * * * *output.vEyeNormal * * * * * * * * *= float4( vecEye, fRcpEyeLength ); * * * * * *output.vFaceNormal * * * * * * * * *= vecWorldNormal; * * * * * * * * * * * *#ifdef XFX_TANGENTSPACE * * * * * * * * * * * * * * *output.vFaceTangent * * * * * *= vecWorldTangent; * * * * * * * * * * * * * * *#endif //XFX_TANGENTSPACE * * * * * * * * * * * *output.vDepthMapAndDepth * * *= float4( vecProjectedPos.xy * float2( 0.5f, -0.5f ) + vecProjectedPos.w ** 0.5f, vecProjectedPos.w * 0.0001f, vecProjectedPos.w );
* * *#endif //XFX_ZPASS * * * * * * * * * * * *// * * *// *RESULT * * *// * * *return output; }
#endif // XFX_VS
#ifdef XFX_PS
//************************************************** ************************* // * * *PIXELSHADER PS // * * *Default pixel shader for sv 3_0 //************************************************** ************************* float4 PS( const PS_INPUT_3_0 input ) : COLOR { * * * * * *#ifdef XFX_ZPASS * * * * * * * * *#ifdef XFX_SPECIALDEPTHPASS
* * * * * * * * *float4 colResult = input.vDepth;
* * * * * *#else // XFX_SPECIALDEPTHPASS
* * * * * * * * *float4 colResult = 0.0f;
* * * * * *#endif // else XFX_SPECIALDEPTHPASS
* * * * * *#else //XFX_ZPASS
* * * * * *// * * * * * *// *XFX_TANGENTSPACE * * * * * *// * * * * * *#ifdef XFX_TANGENTSPACE * * * * * * * * * * * * * * *float3 vecFaceNormal * * *= normalize( (half3)input.vFaceNormal ); * * * * * * * * *float3 vecFaceTangent * * *= normalize( (half3)input.vFaceTangent ); * * * * * * * * *float3 vecFaceBiNormal * * *= cross( vecFaceNormal, vecFaceTangent ); * * * * * * * * * * * * * * *#endif //XFX_TANGENTSPACE * * * * * * * * * * * * * * * * * *// * * * * * *// *XFX_PS_STATICBUMPMAP && XFX_PS_FLOWINGBUMPMAP * * * * * *// * * * * * *#ifdef XFX_PS_STATICBUMPMAP * * * * * * * * * * * * * * * * * *#ifdef XFX_PS_FLOWINGBUMPMAP * * * * * * * * * * * * * * * * * * * * *float4 vecInputBump * * * * * *= ( lerp( XFX_PS_FLOWINGBUMPMAP, XFX_PS_STATICBUMPMAP, input.vDiff.a ) - 0.5f ) * 2.0f; * * * * * * * * * * * *float3 vecBumpNormal * * *= float3( vecInputBump.w, vecInputBump.y, sqrt(1.0 - vecInputBump.w*vecInputBump.w - vecInputBump.y*vecInputBump.y) ); * * * * * * * * * * * * * * * * * *float3 vecWorldBumpNormal = mul( vecBumpNormal, float3x3( vecFaceTangent, vecFaceBiNormal, vecFaceNormal ) );
* * * * * * * * * * * *vecWorldBumpNormal * * * * * *= lerp( input.vFaceNormal, vecWorldBumpNormal, input.vDiff.b ); * * * * * * * * * * * *vecWorldBumpNormal * * * * * *= normalize( (half3)vecWorldBumpNormal );
* * * * * * * * *#else //XFX_PS_FLOWINGBUMPMAP * * * * * * * * * * * * * * * * * * * * *float4 vecInputBump * * * * * *= ( XFX_PS_STATICBUMPMAP - 0.5f ) * 2.0f; * * * * * * * * * * * *float3 vecBumpNormal * * *= float3( vecInputBump.w, vecInputBump.y, sqrt(1.0 - vecInputBump.w*vecInputBump.w - vecInputBump.y*vecInputBump.y) );
* * * * * * * * * * * *float3 vecWorldBumpNormal = mul( vecBumpNormal, float3x3( vecFaceTangent, vecFaceBiNormal, vecFaceNormal ) );
* * * * * * * * * * * *vecWorldBumpNormal * * * * * *= lerp( input.vFaceNormal,vecWorldBumpNormal, input.vDiff.b ); * * * * * * * * * * * *vecWorldBumpNormal * * * * * *= normalize( (half3)vecWorldBumpNormal ); * * * * * * * * * * * * * * * * * * * * *#endif //XFX_PS_FLOWINGBUMPMAP * * * * * * * * * * * * * * *#else //XFX_PS_STATICBUMPMAP * * * * * * * * * * * * * * * * * *#ifdef XFX_PS_FLOWINGBUMPMAP * * * * * * * * * * * * * * * * * * * * *float4 vecInputBump * * * * * *= ( XFX_PS_FLOWINGBUMPMAP - 0.5f ) * 2.0f; * * * * * * * * * * * *float3 vecBumpNormal * * *= float3( vecInputBump.w, vecInputBump.y, sqrt(1.0 - vecInputBump.w*vecInputBump.w - vecInputBump.y*vecInputBump.y) );
* * * * * * * * * * * *float3 vecWorldBumpNormal = mul( vecBumpNormal, float3x3( vecFaceTangent, vecFaceBiNormal, vecFaceNormal ) );
* * * * * * * * * * * *vecWorldBumpNormal * * * * * *= lerp( input.vFaceNormal, vecWorldBumpNormal, input.vDiff.b ); * * * * * * * * * * * *vecWorldBumpNormal * * * * * *= normalize( (half3)vecWorldBumpNormal );
* * * * * * * * *#else //XFX_PS_FLOWINGBUMPMAP * * * * * * * * * * * * * * * * * * * * *float3 vecBumpNormal * * *= input.vFaceNormal; * * * * * * * * * * * *vecWorldBumpNormal * * * * * *= normalize( (half3)vecBumpNormal ); * * * * * * * * * * * * * * * * * * * * *#endif //XFX_PS_FLOWINGBUMPMAP * * * * * * * * * * * * * * *#endif //XFX_PS_STATICBUMPMAP * * * * * * * * * * * *float fLocalDepth = *saturate( tex2Dproj( smpDepthMap, input.vDepthMapAndDepth).r - input.vDepthMapAndDepth.z ); * * * * * *if (fLocalDepth == 0) fLocalDepth = 0.3; * * * * * * * * * * * *// * * * * * *// *XFX_PS_REFLECTIONMAP && XFX_PS_DISTORTION && XFX_PS_DIFFUSEMAP && XFX_SHOREFADING * * * * * *// * * * * * *#ifdef XFX_PS_REFLECTIONMAP
* * * * * * * * *float3 vecEyeNormal * * * * * *= input.vEyeNormal.xyz * input.vEyeNormal.w;
* * * * * * * * *float fFresnel * * * * * * * * *= CalcFresnelReflection( vecEyeNormal, vecWorldBumpNormal, float2( vecWaterConstants.x, vecWaterConstants.y) );
* * * * * * * * *float3 vecReflect * * * * * *= reflect( -vecEyeNormal, vecWorldBumpNormal ); * * * * * * * * *#define XFX_PS_REFLECT vecReflect * * * * * * * * * * * * * * * * * *float4 colResult;
* * * * * * * * *#ifdef XFX_SHOREFADING * * * * * * * * * * * * * * * * * * * * *colResult.a * * * * * *= sqrt( saturate( fLocalDepth * vecWaterConstants.z ) );
* * * * * * * * *#else //XFX_SHOREFADING * * * * * * * * * * * * * * * * * * * * *colResult.a * * * * * *= 1.0f; * * * * * * * * * * * * * * * * * * * * *#endif //XFX_SHOREFADING
* * * * * * * * *float4 vecDepthDimmer = saturate( exp( -fLocalDepth*vecDepthColorHalfLife ) ); * * * * * * * * * * * * * * * * * * * * *#ifdef XFX_PS_DISTORTION * * * * * * * * * * * * * * * * * * * * *float2 vecRefract * * * * * *= vecBumpNormal*XFX_PS_DISTORTION*fLocalDepth; * * * * * * * * * * * *float2 vecTexRefrect * * *= input.vPos.xy*vecVPosToRefractmap.xy; * * * * * * * * * * * *float4 colRefractA * * * * * *= tex2D( smpRefract, vecTexRefrect + vecRefract ); * * * * * * * * * * * *float4 colRefractB * * * * * *= tex2D( smpRefract, vecTexRefrect ); * * * * * * * * * * * * * * * * * * * * * * * *colResult.rgb * * * * * * * * *= lerp( colRefractA.rgb, colRefractB.rgb, colRefractA.w*colResult.a ); * * * * * * * * * * * * * * * * * * * * * * * *#ifdef XFX_PS_DIFFUSEMAP
* * * * * * * * * * * * * * *float4 colDiffuse ** * * * * *= XFX_PS_DIFFUSEMAP; * * * * * * * * * * * * * * *colResult.rgb * * * * * * * * *= lerp( lerp( colResult*vecDepthDimmer, XFX_PS_REFLECTIONMAP*colReflectionModulate, fFresnel ), colDiffuse.rgb, colDiffuse.a ); * * * * * * * * * * * * * * * * * * * * * * * * * * *#else //XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * * * * * * * *colResult.rgb * * * * * * * * *= lerp( colResult*vecDepthDimmer, XFX_PS_REFLECTIONMAP*colReflectionModulate, fFresnel ); * * * * * * * * * * * * * * * * * * * * * * * * * * *#endif //XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * *#else //XFX_PS_DISTORTION * * * * * * * * * * * * * * * * * * * * *#ifdef XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * * * * * * * *colResult.rgb * * * * * * * * *= lerp( XFX_PS_DIFFUSEMAP*vecDepthDimmer, XFX_PS_REFLECTIONMAP*colReflectionModulate, fFresnel ); * * * * * * * * * * * * * * * * * * * * * * * * * * *#else //XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * * * * * * * *colResult.rgb * * * * * * * * *= XFX_PS_REFLECTIONMAP*colReflectionModulate; * * * * * * * * * * * * * * * * * * * * * * * *#endif //XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * *#endif //XFX_PS_DISTORTION
* * * * * *#else //XFX_PS_REFLECTIONMAP * * * * * * * * * * * * * * * * * *#ifdef XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * *half4 colResult * * *= XFX_PS_DIFFUSEMAP; * * * * * * * * * * * * * * * * * * * * *#else //XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * * * * * * * *half4 colResult * * *= input.vDiff; * * * * * * * * * * * * * * * * * * * * *#endif //XFX_PS_DIFFUSEMAP * * * * * * * * * * * * * * *colResult.a * * * * * *= 1.0f;
* * * * * *#endif //XFX_PS_REFLECTIONMAP * * * * * * * * * * * * * * * * * *// * * * * * *// * * *XFX_SPECULAR * * * * * *// * * * * * *#ifdef XFX_SPECULAR * * * * * * * * * * * * * * *#ifdef XFX_PS_SPECULAR * * * * * * * * * * * * * * * * * * * * *float3 vecHalf * * *= normalize( (half3)( DirLight.vecInvDir + vecEyeNormal )); * * * * * * * * * * * *float fNDotH * * *= saturate( dot( vecHalf, vecWorldBumpNormal ) ); * * * * * * * * * * * * * * *float fSpecular = pow( fNDotH, XFX_PS_SPECULARPOWER * 127.0f ) + smoothstep( 1.0, 0.97, vecBumpNormal.z ); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *colResult.rgb += DirLight.colSpecular * fSpecular * (float3)( XFX_PS_SPECULAR );
* * * * * * * * *#endif //XFX_PS_SPECULAR
* * * * * *#endif //XFX_SPECULAR * * * * * * * * * * * *// * * * * * *// *CALC FOG * * * * * *// * * * * * *#ifndef XFX_ADDITIONAL_PASS
* * * * * * * * *colResult.xyz = lerp( colFog, colResult.xyz, input.vFog );
* * * * * *#endif // XFX_ADDITIONAL_PASS * * * * * *#endif //XFX_ZPASS
* * *// * * *// *RESULT * * *// * * *return colResult;
}
#endif // XFX_PS
// //----------------------------------------------------------------------------- PREPROCESSOR //
#endif //WIN32
Добавленная строка выделена жирным. Содержимое спойлера надо сохранить в файл Data\Materials\ShaderMaterial\Effects\ge_ocean_3_0 .fx Теоретически из этого можно сделать мод, но не знаю, насколько это нужно. Надеюсь, это будет кому-то полезным :)
|