diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 362a04ca5..8d84af98f 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -59,9 +59,9 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const { CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "gbuffer"); CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbuffer", true); + CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "Underwater"); CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "gbufferFinalizer"); CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbufferFinalizer", true); - CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "Underwater"); } else { diff --git a/files/CMakeLists.txt b/files/CMakeLists.txt index 377e2d1f8..507f82c1a 100644 --- a/files/CMakeLists.txt +++ b/files/CMakeLists.txt @@ -1,8 +1,7 @@ project(resources) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/caustic_0.png "${OpenMW_BINARY_DIR}/resources/water/caustic_0.png" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/GlassFP.cg "${OpenMW_BINARY_DIR}/resources/water/GlassFP.cg" COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/GlassVP.cg "${OpenMW_BINARY_DIR}/resources/water/GlassVP.cg" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/underwater.cg "${OpenMW_BINARY_DIR}/resources/water/underwater.cg" COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/perlinvolume.dds "${OpenMW_BINARY_DIR}/resources/water/perlinvolume.dds" COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/water.compositor "${OpenMW_BINARY_DIR}/resources/water/water.compositor" COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/water.material "${OpenMW_BINARY_DIR}/resources/water/water.material" COPYONLY) diff --git a/files/water/GlassFP.cg b/files/water/GlassFP.cg deleted file mode 100644 index 1e6c53984..000000000 --- a/files/water/GlassFP.cg +++ /dev/null @@ -1,15 +0,0 @@ - -float4 main_ps(float2 iTexCoord : TEXCOORD0, - float3 noiseCoord : TEXCOORD1, - uniform sampler2D RT : register(s0), - uniform sampler2D NormalMap : register(s1), - uniform sampler2D CausticMap : register(s2), - uniform float4 tintColour) : COLOR -{ - float4 normal = tex2D(NormalMap, noiseCoord) * 2 - 1; - - - return tex2D(RT, iTexCoord + normal.xy * 0.015) + - (tex2D(CausticMap, noiseCoord) / 5) + - tintColour ; -} diff --git a/files/water/GlassVP.cg b/files/water/GlassVP.cg deleted file mode 100644 index 71153769c..000000000 --- a/files/water/GlassVP.cg +++ /dev/null @@ -1,24 +0,0 @@ -void glass_vp -( - in float4 inPos : POSITION, - - out float4 pos : POSITION, - out float2 uv0 : TEXCOORD0, - out float4 noiseCoord : TEXCOORD1, - - uniform float4x4 worldViewProj, - uniform float timeVal, - uniform float scale -) -{ - // Use standardise transform, so work accord with render system specific (RS depth, requires texture flipping, etc) - pos = mul(worldViewProj, inPos); - - // The input positions adjusted by texel offsets, so clean up inaccuracies - inPos.xy = sign(inPos.xy); - - // Convert to image-space - uv0 = (float2(inPos.x, -inPos.y) + 1.0f) * 0.5f; - noiseCoord = (pos + timeVal) * scale; -} - diff --git a/files/water/underwater.cg b/files/water/underwater.cg new file mode 100644 index 000000000..a734c316f --- /dev/null +++ b/files/water/underwater.cg @@ -0,0 +1,61 @@ +void main_vp +( + in float4 inPos : POSITION, + + out float4 pos : POSITION, + out float2 uv0 : TEXCOORD0, + out float4 noiseCoord : TEXCOORD1, + + uniform float4x4 worldViewProj, + uniform float timeVal, + uniform float scale +) +{ + // Use standardise transform, so work accord with render system specific (RS depth, requires texture flipping, etc) + pos = mul(worldViewProj, inPos); + + // The input positions adjusted by texel offsets, so clean up inaccuracies + inPos.xy = sign(inPos.xy); + + // Convert to image-space + uv0 = (float2(inPos.x, -inPos.y) + 1.0f) * 0.5f; + noiseCoord = (pos + timeVal) * scale; +} + + + +float4 main_fp_nomrt (float2 iTexCoord : TEXCOORD0, + float3 noiseCoord : TEXCOORD1, + uniform sampler2D RT : register(s0), + uniform sampler2D NormalMap : register(s1), + uniform sampler2D CausticMap : register(s2), + uniform float4 tintColour) : COLOR +{ + float4 normal = tex2D(NormalMap, noiseCoord) * 2 - 1; + + return tex2D(RT, iTexCoord + normal.xy * 0.015) + + (tex2D(CausticMap, noiseCoord) / 5) + + tintColour ; +} + + +float4 main_fp (float2 iTexCoord : TEXCOORD0, + float3 noiseCoord : TEXCOORD1, + uniform float far, + uniform sampler2D RT : register(s0), + uniform sampler2D NormalMap : register(s1), + uniform sampler2D CausticMap : register(s2), + uniform sampler2D DepthMap : register(s3), + uniform float4 tintColour) : COLOR +{ + float4 normal = tex2D(NormalMap, noiseCoord) * 2 - 1; + + float depth = tex2D(DepthMap, iTexCoord).r * far; + depth = saturate(depth / 2000.f); + + float4 color = tex2D(RT, iTexCoord + normal.xy * 0.015) + + (tex2D(CausticMap, noiseCoord) / 5) + + tintColour; + + return lerp(color, float4(0, 0.65, 0.65, 1), depth); +} diff --git a/files/water/water.cg b/files/water/water.cg index 85c86f3b6..a3393e3bf 100644 --- a/files/water/water.cg +++ b/files/water/water.cg @@ -98,6 +98,9 @@ void main_fp oColor.xyz = lerp(refraction.xyz, reflection.xyz, opacity); + oColor.xyz += isUnderwater * float3(0, 0.35, 0.35); // underwater tint color + oColor.xyz = lerp(oColor.xyz, float3(0, 0.65, 0.65), saturate(isUnderwater * (iDepth / 2000.f))); // underwater fog + // add fog float fogValue = saturate((iDepth - fogParams.y) * fogParams.w); oColor.xyz = lerp(oColor.xyz, fogColour, fogValue); diff --git a/files/water/water.material b/files/water/water.material index 3afbaacd5..1b8573c4a 100644 --- a/files/water/water.material +++ b/files/water/water.material @@ -1,7 +1,7 @@ -vertex_program Water/GlassVP cg +vertex_program UnderwaterEffectVP cg { - source GlassVP.cg - entry_point glass_vp + source underwater.cg + entry_point main_vp profiles vs_1_1 arbvp1 default_params @@ -11,10 +11,17 @@ vertex_program Water/GlassVP cg } -fragment_program Water/GlassFP cg +fragment_program UnderwaterEffectFP_NoMRT cg { - source GlassFP.cg - entry_point main_ps + source underwater.cg + entry_point main_fp_nomrt + profiles ps_2_0 arbfp1 +} + +fragment_program UnderwaterEffectFP cg +{ + source underwater.cg + entry_point main_fp profiles ps_2_0 arbfp1 } @@ -111,13 +118,13 @@ material Water/CompositorNoMRT pass { depth_check off - vertex_program_ref Water/GlassVP + vertex_program_ref UnderwaterEffectVP { param_named_auto timeVal time 0.25 param_named scale float 0.1 } - fragment_program_ref Water/GlassFP + fragment_program_ref UnderwaterEffectFP_NoMRT { param_named tintColour float4 0 0.35 0.35 1 } @@ -154,37 +161,33 @@ material Water/Compositor pass { depth_check off - vertex_program_ref Water/GlassVP + vertex_program_ref UnderwaterEffectVP { param_named_auto timeVal time 0.25 param_named scale float 0.1 } - fragment_program_ref Water/GlassFP + fragment_program_ref UnderwaterEffectFP { param_named tintColour float4 0 0.35 0.35 1 + param_named_auto far far_clip_distance } texture_unit RT { - tex_coord_set 0 + tex_coord_set 0 tex_address_mode clamp - filtering linear linear linear } texture_unit { texture WaterNormal2.tga 2d - tex_coord_set 2 - //tex_address_mode clamp - filtering linear linear linear + tex_coord_set 2 } texture_unit { texture caustic_0.png 2d - tex_coord_set 3 - //tex_address_mode clamp - filtering linear linear linear + tex_coord_set 3 } texture_unit DepthMap