diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | compiler/cmake/sample_opengl.cmake | 18 | ||||
| -rw-r--r-- | include/GFSDK_WaveWorks_Attributes.fxh | 370 | ||||
| -rw-r--r-- | include/GFSDK_WaveWorks_Common.fxh | 16 | ||||
| -rw-r--r-- | include/GFSDK_WaveWorks_Quadtree.fxh | 136 | ||||
| -rw-r--r-- | media/sample/ocean_surface_d3d11.fxo | bin | 50313 -> 49939 bytes | |||
| -rw-r--r-- | media/test/ocean_surface_d3d11.fxo | bin | 33379 -> 32905 bytes | |||
| -rw-r--r-- | src/Internal.h | 2 | ||||
| -rw-r--r-- | src/Quadtree.cpp | 16 | ||||
| -rw-r--r-- | src/Simulation.cpp | 220 | ||||
| -rw-r--r-- | src/shader/CalcGradient.fx | 60 | ||||
| -rw-r--r-- | src/shader/CalcGradient_glsl_ps.h | 36 | ||||
| -rw-r--r-- | src/shader/CalcGradient_glsl_vs.h | 26 | ||||
| -rw-r--r-- | src/shader/FoamGeneration.fx | 54 | ||||
| -rw-r--r-- | src/shader/FoamGeneration_glsl_ps.h | 41 | ||||
| -rw-r--r-- | src/shader/FoamGeneration_glsl_vs.h | 25 | ||||
| -rw-r--r-- | src/shader/Quadtree_SM4_sig.fx | 2 | ||||
| -rw-r--r-- | src/shader/Quadtree_SM5_sig.fx | 2 |
18 files changed, 582 insertions, 444 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index ecf6ac8..9395503 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,4 +125,4 @@ INCLUDE(compiler/cmake/test_d3d11.cmake) INCLUDE(compiler/cmake/sample_d3d11.cmake) # TODO: Switch between CUDA/DirectCompute -#INCLUDE(compiler/cmake/sample_opengl.cmake) +INCLUDE(compiler/cmake/sample_opengl.cmake) diff --git a/compiler/cmake/sample_opengl.cmake b/compiler/cmake/sample_opengl.cmake index 6518c90..cac1150 100644 --- a/compiler/cmake/sample_opengl.cmake +++ b/compiler/cmake/sample_opengl.cmake @@ -3,14 +3,15 @@ # -FIND_PACKAGE(AntTweakBar REQUIRED) +FIND_PACKAGE(AntTweakBar 1.0 REQUIRED) SET(SAMP_SOURCE_DIR ${PROJECT_SOURCE_DIR}/sample/opengl) SET(TL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) +SET(SHADER_DIR ${PROJECT_SOURCE_DIR}/src/shader) IF(TARGET_BUILD_PLATFORM STREQUAL "Windows") - FIND_PACKAGE(DirectX REQUIRED) +# FIND_PACKAGE(DirectX REQUIRED) SET(WW_PLATFORM_INCLUDES ) @@ -79,16 +80,25 @@ SET(APP_FILES ${SAMP_SOURCE_DIR}/water.glsl ) +SET(SHADER_H_FILES + ${SHADER_DIR}/CalcGradient_glsl_vs.h + ${SHADER_DIR}/CalcGradient_glsl_ps.h + + ${SHADER_DIR}/FoamGeneration_glsl_vs.h + ${SHADER_DIR}/FoamGeneration_glsl_ps.h +) + ADD_EXECUTABLE(SampleOpenGL WIN32 ${WW_PLATFORM_SRC_FILES} ${APP_FILES} - + ${SHADER_H_FILES} ) -SOURCE_GROUP("app" FILES ${APP_FILES}) +SOURCE_GROUP("app" FILES ${APP_FILES}) +SOURCE_GROUP("glsl" FILES ${SHADER_H_FILES}) # Target specific compile options diff --git a/include/GFSDK_WaveWorks_Attributes.fxh b/include/GFSDK_WaveWorks_Attributes.fxh index 840243c..13a32b0 100644 --- a/include/GFSDK_WaveWorks_Attributes.fxh +++ b/include/GFSDK_WaveWorks_Attributes.fxh @@ -64,53 +64,53 @@ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER_TEXTUREARRAY(SampLabel,TexLabel,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_VS_SAMPLER_TEXTUREARRAY(SampLabel,TexLabel,Regoff) #endif -GFSDK_WAVEWORKS_BEGIN_ATTR_DISPLACEMENT_CBUFFER(nvsf_attr_vs_buffer) -GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float3, nvsf_g_WorldEye, 0) +GFSDK_WAVEWORKS_BEGIN_ATTR_DISPLACEMENT_CBUFFER(attr_vs_buffer) +GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float3, g_WorldEye, 0) #if defined( GFSDK_WAVEWORKS_GL ) - GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float, nvsf_g_UseTextureArrays, 1) + GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float, g_UseTextureArrays, 1) #else - GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float, nvsf_g_Pad1, 1) + GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float, g_Pad1, 1) #endif -GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float4, nvsf_g_UVScaleCascade0123, 2) +GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float4, g_UVScaleCascade0123, 2) GFSDK_WAVEWORKS_END_ATTR_DISPLACEMENT_CBUFFER -GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap0, nvsf_g_textureDisplacementMap0, 0) -GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap1, nvsf_g_textureDisplacementMap1, 1) -GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap2, nvsf_g_textureDisplacementMap2, 2) -GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap3, nvsf_g_textureDisplacementMap3, 3) +GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(g_samplerDisplacementMap0, g_textureDisplacementMap0, 0) +GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(g_samplerDisplacementMap1, g_textureDisplacementMap1, 1) +GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(g_samplerDisplacementMap2, g_textureDisplacementMap2, 2) +GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(g_samplerDisplacementMap3, g_textureDisplacementMap3, 3) #if defined( GFSDK_WAVEWORKS_GL ) - GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER_TEXTUREARRAY(nvsf_g_samplerDisplacementMapTextureArray, nvsf_g_textureArrayDisplacementMap, 4) + GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER_TEXTUREARRAY(g_samplerDisplacementMapTextureArray, g_textureArrayDisplacementMap, 4) #endif -GFSDK_WAVEWORKS_BEGIN_ATTR_PS_CBUFFER(nvsf_attr_ps_buffer) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_TexelLength_x2_PS, 0) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade1Scale_PS, 1) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade1TexelScale_PS, 2) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade1UVOffset_PS, 3) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade2Scale_PS, 4) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade2TexelScale_PS, 5) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade2UVOffset_PS, 6) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade3Scale_PS, 7) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade3TexelScale_PS, 8) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade3UVOffset_PS, 9) +GFSDK_WAVEWORKS_BEGIN_ATTR_PS_CBUFFER(attr_ps_buffer) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_TexelLength_x2_PS, 0) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade1Scale_PS, 1) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade1TexelScale_PS, 2) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade1UVOffset_PS, 3) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade2Scale_PS, 4) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade2TexelScale_PS, 5) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade2UVOffset_PS, 6) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade3Scale_PS, 7) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade3TexelScale_PS, 8) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, g_Cascade3UVOffset_PS, 9) GFSDK_WAVEWORKS_END_ATTR_PS_CBUFFER -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap0, nvsf_g_textureGradientMap0, 0) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap1, nvsf_g_textureGradientMap1, 1) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap2, nvsf_g_textureGradientMap2, 2) -GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap3, nvsf_g_textureGradientMap3, 3) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(g_samplerGradientMap0, g_textureGradientMap0, 0) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(g_samplerGradientMap1, g_textureGradientMap1, 1) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(g_samplerGradientMap2, g_textureGradientMap2, 2) +GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(g_samplerGradientMap3, g_textureGradientMap3, 3) #if defined( GFSDK_WAVEWORKS_GL ) - GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER_TEXTUREARRAY(nvsf_g_samplerGradientMapTextureArray, nvsf_g_textureArrayGradientMap, 4) + GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER_TEXTUREARRAY(g_samplerGradientMapTextureArray, g_textureArrayGradientMap, 4) #endif struct GFSDK_WAVEWORKS_INTERPOLATED_VERTEX_OUTPUT { - float4 nvsf_tex_coord_cascade01 SEMANTIC(TEXCOORD0); - float4 nvsf_tex_coord_cascade23 SEMANTIC(TEXCOORD1); - float4 nvsf_blend_factor_cascade0123 SEMANTIC(TEXCOORD2); - float3 nvsf_eye_vec SEMANTIC(TEXCOORD3); + float4 tex_coord_cascade01 SEMANTIC(TEXCOORD0); + float4 tex_coord_cascade23 SEMANTIC(TEXCOORD1); + float4 blend_factor_cascade0123 SEMANTIC(TEXCOORD2); + float3 eye_vec SEMANTIC(TEXCOORD3); }; struct GFSDK_WAVEWORKS_VERTEX_OUTPUT @@ -124,186 +124,186 @@ struct GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WaveWorks_GetDisplacedVertex(GFSDK_WAVEWORKS_VERTEX_INPUT In) { // Get starting position and distance to camera - float3 nvsf_pos_world_undisplaced = GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(In); - float nvsf_distance = length(nvsf_g_WorldEye - nvsf_pos_world_undisplaced); + float3 pos_world_undisplaced = GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(In); + float distance = length(g_WorldEye - pos_world_undisplaced); // UVs - float2 nvsf_uv_world_cascade0 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.x; - float2 nvsf_uv_world_cascade1 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.y; - float2 nvsf_uv_world_cascade2 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.z; - float2 nvsf_uv_world_cascade3 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.w; + float2 uv_world_cascade0 = pos_world_undisplaced.xy * g_UVScaleCascade0123.x; + float2 uv_world_cascade1 = pos_world_undisplaced.xy * g_UVScaleCascade0123.y; + float2 uv_world_cascade2 = pos_world_undisplaced.xy * g_UVScaleCascade0123.z; + float2 uv_world_cascade3 = pos_world_undisplaced.xy * g_UVScaleCascade0123.w; // cascade blend factors - float4 nvsf_blendfactors; - float4 nvsf_cascade_spatial_size = 1.0/nvsf_g_UVScaleCascade0123.xyzw; - nvsf_blendfactors.x = 1.0; - nvsf_blendfactors.yzw = saturate(0.25*(nvsf_cascade_spatial_size.yzw*24.0-nvsf_distance)/nvsf_cascade_spatial_size.yzw); - nvsf_blendfactors.yzw *= nvsf_blendfactors.yzw; + float4 blendfactors; + float4 cascade_spatial_size = 1.0/g_UVScaleCascade0123.xyzw; + blendfactors.x = 1.0; + blendfactors.yzw = saturate(0.25*(cascade_spatial_size.yzw*24.0-distance)/cascade_spatial_size.yzw); + blendfactors.yzw *= blendfactors.yzw; // Displacement map #if defined(GFSDK_WAVEWORKS_GL) - float3 nvsf_displacement; - if(nvsf_g_UseTextureArrays > 0) + float3 displacement; + if(g_UseTextureArrays > 0) { - nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade0, 0.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade1, 1.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade2, 2.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade3, 3.0), 0).xyz; + displacement = blendfactors.x * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade0, 0.0), 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade1, 1.0), 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade2, 2.0), 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade3, 3.0), 0).xyz; } else { - nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz; + displacement = blendfactors.x * SampleTex2Dlod(g_textureDisplacementMap0, g_samplerDisplacementMap0, uv_world_cascade0, 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureDisplacementMap1, g_samplerDisplacementMap1, uv_world_cascade1, 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureDisplacementMap2, g_samplerDisplacementMap2, uv_world_cascade2, 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureDisplacementMap3, g_samplerDisplacementMap3, uv_world_cascade3, 0).xyz; } #else - float3 nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz; + float3 displacement = blendfactors.x * SampleTex2Dlod(g_textureDisplacementMap0, g_samplerDisplacementMap0, uv_world_cascade0, 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureDisplacementMap1, g_samplerDisplacementMap1, uv_world_cascade1, 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureDisplacementMap2, g_samplerDisplacementMap2, uv_world_cascade2, 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureDisplacementMap3, g_samplerDisplacementMap3, uv_world_cascade3, 0).xyz; #endif - float3 nvsf_pos_world = nvsf_pos_world_undisplaced + nvsf_displacement; + float3 pos_world = pos_world_undisplaced + displacement; // Output GFSDK_WAVEWORKS_VERTEX_OUTPUT Output; - Output.interp.nvsf_eye_vec = nvsf_g_WorldEye - nvsf_pos_world; - Output.interp.nvsf_tex_coord_cascade01.xy = nvsf_uv_world_cascade0; - Output.interp.nvsf_tex_coord_cascade01.zw = nvsf_uv_world_cascade1; - Output.interp.nvsf_tex_coord_cascade23.xy = nvsf_uv_world_cascade2; - Output.interp.nvsf_tex_coord_cascade23.zw = nvsf_uv_world_cascade3; - Output.interp.nvsf_blend_factor_cascade0123 = nvsf_blendfactors; - Output.pos_world = nvsf_pos_world; - Output.pos_world_undisplaced = nvsf_pos_world_undisplaced; - Output.world_displacement = nvsf_displacement; + Output.interp.eye_vec = g_WorldEye - pos_world; + Output.interp.tex_coord_cascade01.xy = uv_world_cascade0; + Output.interp.tex_coord_cascade01.zw = uv_world_cascade1; + Output.interp.tex_coord_cascade23.xy = uv_world_cascade2; + Output.interp.tex_coord_cascade23.zw = uv_world_cascade3; + Output.interp.blend_factor_cascade0123 = blendfactors; + Output.pos_world = pos_world; + Output.pos_world_undisplaced = pos_world_undisplaced; + Output.world_displacement = displacement; return Output; } GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WaveWorks_GetDisplacedVertexAfterTessellation(float4 In0, float4 In1, float4 In2, float3 BarycentricCoords) { // Get starting position - float3 nvsf_tessellated_ws_position = In0.xyz * BarycentricCoords.x + + float3 tessellated_ws_position = In0.xyz * BarycentricCoords.x + In1.xyz * BarycentricCoords.y + In2.xyz * BarycentricCoords.z; - float3 nvsf_pos_world_undisplaced = nvsf_tessellated_ws_position; + float3 pos_world_undisplaced = tessellated_ws_position; // blend factors for cascades - float4 nvsf_blendfactors; - float nvsf_distance = length(nvsf_g_WorldEye - nvsf_pos_world_undisplaced); - float4 nvsf_cascade_spatial_size = 1.0/nvsf_g_UVScaleCascade0123.xyzw; - nvsf_blendfactors.x = 1.0; - nvsf_blendfactors.yzw = saturate(0.25*(nvsf_cascade_spatial_size.yzw*24.0-nvsf_distance)/nvsf_cascade_spatial_size.yzw); - nvsf_blendfactors.yzw *= nvsf_blendfactors.yzw; + float4 blendfactors; + float distance = length(g_WorldEye - pos_world_undisplaced); + float4 cascade_spatial_size = 1.0/g_UVScaleCascade0123.xyzw; + blendfactors.x = 1.0; + blendfactors.yzw = saturate(0.25*(cascade_spatial_size.yzw*24.0-distance)/cascade_spatial_size.yzw); + blendfactors.yzw *= blendfactors.yzw; // UVs - float2 nvsf_uv_world_cascade0 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.x; - float2 nvsf_uv_world_cascade1 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.y; - float2 nvsf_uv_world_cascade2 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.z; - float2 nvsf_uv_world_cascade3 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.w; + float2 uv_world_cascade0 = pos_world_undisplaced.xy * g_UVScaleCascade0123.x; + float2 uv_world_cascade1 = pos_world_undisplaced.xy * g_UVScaleCascade0123.y; + float2 uv_world_cascade2 = pos_world_undisplaced.xy * g_UVScaleCascade0123.z; + float2 uv_world_cascade3 = pos_world_undisplaced.xy * g_UVScaleCascade0123.w; // Displacement map #if defined(GFSDK_WAVEWORKS_GL) - float3 nvsf_displacement; - if(nvsf_g_UseTextureArrays > 0) + float3 displacement; + if(g_UseTextureArrays > 0) { - nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade0, 0.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade1, 1.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade2, 2.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade3, 3.0), 0).xyz; + displacement = blendfactors.x * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade0, 0.0), 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade1, 1.0), 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade2, 2.0), 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade3, 3.0), 0).xyz; } else { - nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz; + displacement = blendfactors.x * SampleTex2Dlod(g_textureDisplacementMap0, g_samplerDisplacementMap0, uv_world_cascade0, 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureDisplacementMap1, g_samplerDisplacementMap1, uv_world_cascade1, 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureDisplacementMap2, g_samplerDisplacementMap2, uv_world_cascade2, 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureDisplacementMap3, g_samplerDisplacementMap3, uv_world_cascade3, 0).xyz; } #else - float3 nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz; + float3 displacement = blendfactors.x * SampleTex2Dlod(g_textureDisplacementMap0, g_samplerDisplacementMap0, uv_world_cascade0, 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureDisplacementMap1, g_samplerDisplacementMap1, uv_world_cascade1, 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureDisplacementMap2, g_samplerDisplacementMap2, uv_world_cascade2, 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureDisplacementMap3, g_samplerDisplacementMap3, uv_world_cascade3, 0).xyz; #endif - float3 nvsf_pos_world = nvsf_pos_world_undisplaced + nvsf_displacement; + float3 pos_world = pos_world_undisplaced + displacement; // Output GFSDK_WAVEWORKS_VERTEX_OUTPUT Output; - Output.interp.nvsf_eye_vec = nvsf_g_WorldEye - nvsf_pos_world; - Output.interp.nvsf_tex_coord_cascade01.xy = nvsf_uv_world_cascade0; - Output.interp.nvsf_tex_coord_cascade01.zw = nvsf_uv_world_cascade1; - Output.interp.nvsf_tex_coord_cascade23.xy = nvsf_uv_world_cascade2; - Output.interp.nvsf_tex_coord_cascade23.zw = nvsf_uv_world_cascade3; - Output.interp.nvsf_blend_factor_cascade0123 = nvsf_blendfactors; - Output.pos_world = nvsf_pos_world; - Output.pos_world_undisplaced = nvsf_pos_world_undisplaced; - Output.world_displacement = nvsf_displacement; + Output.interp.eye_vec = g_WorldEye - pos_world; + Output.interp.tex_coord_cascade01.xy = uv_world_cascade0; + Output.interp.tex_coord_cascade01.zw = uv_world_cascade1; + Output.interp.tex_coord_cascade23.xy = uv_world_cascade2; + Output.interp.tex_coord_cascade23.zw = uv_world_cascade3; + Output.interp.blend_factor_cascade0123 = blendfactors; + Output.pos_world = pos_world; + Output.pos_world_undisplaced = pos_world_undisplaced; + Output.world_displacement = displacement; return Output; } GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WaveWorks_GetDisplacedVertexAfterTessellationQuad(float4 In0, float4 In1, float4 In2, float4 In3, float2 UV) { // Get starting position - float3 nvsf_tessellated_ws_position = In2.xyz*UV.x*UV.y + + float3 tessellated_ws_position = In2.xyz*UV.x*UV.y + In0.xyz*(1.0-UV.x)*UV.y + In1.xyz*(1.0-UV.x)*(1.0-UV.y) + In3.xyz*UV.x*(1.0-UV.y); - float3 nvsf_pos_world_undisplaced = nvsf_tessellated_ws_position; + float3 pos_world_undisplaced = tessellated_ws_position; // blend factors for cascades - float4 nvsf_blendfactors; - float nvsf_distance = length(nvsf_g_WorldEye - nvsf_pos_world_undisplaced); - float4 nvsf_cascade_spatial_size = 1.0/nvsf_g_UVScaleCascade0123.xyzw; - nvsf_blendfactors.x = 1.0; - nvsf_blendfactors.yzw = saturate(0.25*(nvsf_cascade_spatial_size.yzw*24.0-nvsf_distance)/nvsf_cascade_spatial_size.yzw); - nvsf_blendfactors.yzw *= nvsf_blendfactors.yzw; + float4 blendfactors; + float distance = length(g_WorldEye - pos_world_undisplaced); + float4 cascade_spatial_size = 1.0/g_UVScaleCascade0123.xyzw; + blendfactors.x = 1.0; + blendfactors.yzw = saturate(0.25*(cascade_spatial_size.yzw*24.0-distance)/cascade_spatial_size.yzw); + blendfactors.yzw *= blendfactors.yzw; // UVs - float2 nvsf_uv_world_cascade0 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.x; - float2 nvsf_uv_world_cascade1 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.y; - float2 nvsf_uv_world_cascade2 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.z; - float2 nvsf_uv_world_cascade3 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.w; + float2 uv_world_cascade0 = pos_world_undisplaced.xy * g_UVScaleCascade0123.x; + float2 uv_world_cascade1 = pos_world_undisplaced.xy * g_UVScaleCascade0123.y; + float2 uv_world_cascade2 = pos_world_undisplaced.xy * g_UVScaleCascade0123.z; + float2 uv_world_cascade3 = pos_world_undisplaced.xy * g_UVScaleCascade0123.w; // Displacement map #if defined(GFSDK_WAVEWORKS_GL) - float3 nvsf_displacement; - if(nvsf_g_UseTextureArrays > 0) + float3 displacement; + if(g_UseTextureArrays > 0) { - nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade0, 0.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade1, 1.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade2, 2.0), 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade3, 3.0), 0).xyz; + displacement = blendfactors.x * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade0, 0.0), 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade1, 1.0), 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade2, 2.0), 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureArrayDisplacementMap, g_samplerDisplacementMapTextureArray, vec3(uv_world_cascade3, 3.0), 0).xyz; } else { - nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz; + displacement = blendfactors.x * SampleTex2Dlod(g_textureDisplacementMap0, g_samplerDisplacementMap0, uv_world_cascade0, 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureDisplacementMap1, g_samplerDisplacementMap1, uv_world_cascade1, 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureDisplacementMap2, g_samplerDisplacementMap2, uv_world_cascade2, 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureDisplacementMap3, g_samplerDisplacementMap3, uv_world_cascade3, 0).xyz; } #else - float3 nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz; - nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz; - nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz; - nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz; + float3 displacement = blendfactors.x * SampleTex2Dlod(g_textureDisplacementMap0, g_samplerDisplacementMap0, uv_world_cascade0, 0).xyz; + displacement += blendfactors.y==0? float3(0,0,0) : blendfactors.y * SampleTex2Dlod(g_textureDisplacementMap1, g_samplerDisplacementMap1, uv_world_cascade1, 0).xyz; + displacement += blendfactors.z==0? float3(0,0,0) : blendfactors.z * SampleTex2Dlod(g_textureDisplacementMap2, g_samplerDisplacementMap2, uv_world_cascade2, 0).xyz; + displacement += blendfactors.w==0? float3(0,0,0) : blendfactors.w * SampleTex2Dlod(g_textureDisplacementMap3, g_samplerDisplacementMap3, uv_world_cascade3, 0).xyz; #endif - float3 nvsf_pos_world = nvsf_pos_world_undisplaced + nvsf_displacement; + float3 pos_world = pos_world_undisplaced + displacement; // Output GFSDK_WAVEWORKS_VERTEX_OUTPUT Output; - Output.interp.nvsf_eye_vec = nvsf_g_WorldEye - nvsf_pos_world; - Output.interp.nvsf_tex_coord_cascade01.xy = nvsf_uv_world_cascade0; - Output.interp.nvsf_tex_coord_cascade01.zw = nvsf_uv_world_cascade1; - Output.interp.nvsf_tex_coord_cascade23.xy = nvsf_uv_world_cascade2; - Output.interp.nvsf_tex_coord_cascade23.zw = nvsf_uv_world_cascade3; - Output.interp.nvsf_blend_factor_cascade0123 = nvsf_blendfactors; - Output.pos_world = nvsf_pos_world; - Output.pos_world_undisplaced = nvsf_pos_world_undisplaced; - Output.world_displacement = nvsf_displacement; + Output.interp.eye_vec = g_WorldEye - pos_world; + Output.interp.tex_coord_cascade01.xy = uv_world_cascade0; + Output.interp.tex_coord_cascade01.zw = uv_world_cascade1; + Output.interp.tex_coord_cascade23.xy = uv_world_cascade2; + Output.interp.tex_coord_cascade23.zw = uv_world_cascade3; + Output.interp.blend_factor_cascade0123 = blendfactors; + Output.pos_world = pos_world; + Output.pos_world_undisplaced = pos_world_undisplaced; + Output.world_displacement = displacement; return Output; } @@ -319,83 +319,83 @@ struct GFSDK_WAVEWORKS_SURFACE_ATTRIBUTES GFSDK_WAVEWORKS_SURFACE_ATTRIBUTES GFSDK_WaveWorks_GetSurfaceAttributes(GFSDK_WAVEWORKS_INTERPOLATED_VERTEX_OUTPUT In) { // Calculate eye vector. - // Beware: 'nvsf_eye_vec' is a large number, 32bit floating point required. - float3 nvsf_eye_dir = normalize(In.nvsf_eye_vec); + // Beware: 'eye_vec' is a large number, 32bit floating point required. + float3 eye_dir = normalize(In.eye_vec); // --------------- Water body color - float4 nvsf_grad_fold0; - float4 nvsf_grad_fold1; - float4 nvsf_grad_fold2; - float4 nvsf_grad_fold3; + float4 grad_fold0; + float4 grad_fold1; + float4 grad_fold2; + float4 grad_fold3; #if defined(GFSDK_WAVEWORKS_GL) - float3 nvsf_displacement; - if(nvsf_g_UseTextureArrays > 0) + float3 displacement; + if(g_UseTextureArrays > 0) { - nvsf_grad_fold0 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade01.xy, 0.0)); - nvsf_grad_fold1 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade01.zw, 1.0)); - nvsf_grad_fold2 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade23.xy, 2.0)); - nvsf_grad_fold3 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade23.zw, 3.0)); + grad_fold0 = SampleTex2D(g_textureArrayGradientMap, g_samplerGradientMapTextureArray, vec3(In.tex_coord_cascade01.xy, 0.0)); + grad_fold1 = SampleTex2D(g_textureArrayGradientMap, g_samplerGradientMapTextureArray, vec3(In.tex_coord_cascade01.zw, 1.0)); + grad_fold2 = SampleTex2D(g_textureArrayGradientMap, g_samplerGradientMapTextureArray, vec3(In.tex_coord_cascade23.xy, 2.0)); + grad_fold3 = SampleTex2D(g_textureArrayGradientMap, g_samplerGradientMapTextureArray, vec3(In.tex_coord_cascade23.zw, 3.0)); } else { - nvsf_grad_fold0 = SampleTex2D(nvsf_g_textureGradientMap0, nvsf_g_samplerGradientMap0, In.nvsf_tex_coord_cascade01.xy); - nvsf_grad_fold1 = SampleTex2D(nvsf_g_textureGradientMap1, nvsf_g_samplerGradientMap1, In.nvsf_tex_coord_cascade01.zw); - nvsf_grad_fold2 = SampleTex2D(nvsf_g_textureGradientMap2, nvsf_g_samplerGradientMap2, In.nvsf_tex_coord_cascade23.xy); - nvsf_grad_fold3 = SampleTex2D(nvsf_g_textureGradientMap3, nvsf_g_samplerGradientMap3, In.nvsf_tex_coord_cascade23.zw); + grad_fold0 = SampleTex2D(g_textureGradientMap0, g_samplerGradientMap0, In.tex_coord_cascade01.xy); + grad_fold1 = SampleTex2D(g_textureGradientMap1, g_samplerGradientMap1, In.tex_coord_cascade01.zw); + grad_fold2 = SampleTex2D(g_textureGradientMap2, g_samplerGradientMap2, In.tex_coord_cascade23.xy); + grad_fold3 = SampleTex2D(g_textureGradientMap3, g_samplerGradientMap3, In.tex_coord_cascade23.zw); } #else - nvsf_grad_fold0 = SampleTex2D(nvsf_g_textureGradientMap0, nvsf_g_samplerGradientMap0, In.nvsf_tex_coord_cascade01.xy); - nvsf_grad_fold1 = SampleTex2D(nvsf_g_textureGradientMap1, nvsf_g_samplerGradientMap1, In.nvsf_tex_coord_cascade01.zw); - nvsf_grad_fold2 = SampleTex2D(nvsf_g_textureGradientMap2, nvsf_g_samplerGradientMap2, In.nvsf_tex_coord_cascade23.xy); - nvsf_grad_fold3 = SampleTex2D(nvsf_g_textureGradientMap3, nvsf_g_samplerGradientMap3, In.nvsf_tex_coord_cascade23.zw); + grad_fold0 = SampleTex2D(g_textureGradientMap0, g_samplerGradientMap0, In.tex_coord_cascade01.xy); + grad_fold1 = SampleTex2D(g_textureGradientMap1, g_samplerGradientMap1, In.tex_coord_cascade01.zw); + grad_fold2 = SampleTex2D(g_textureGradientMap2, g_samplerGradientMap2, In.tex_coord_cascade23.xy); + grad_fold3 = SampleTex2D(g_textureGradientMap3, g_samplerGradientMap3, In.tex_coord_cascade23.zw); #endif - float2 nvsf_grad; - nvsf_grad.xy = nvsf_grad_fold0.xy*In.nvsf_blend_factor_cascade0123.x + - nvsf_grad_fold1.xy*In.nvsf_blend_factor_cascade0123.y*nvsf_g_Cascade1TexelScale_PS + - nvsf_grad_fold2.xy*In.nvsf_blend_factor_cascade0123.z*nvsf_g_Cascade2TexelScale_PS + - nvsf_grad_fold3.xy*In.nvsf_blend_factor_cascade0123.w*nvsf_g_Cascade3TexelScale_PS; + float2 grad; + grad.xy = grad_fold0.xy*In.blend_factor_cascade0123.x + + grad_fold1.xy*In.blend_factor_cascade0123.y*g_Cascade1TexelScale_PS + + grad_fold2.xy*In.blend_factor_cascade0123.z*g_Cascade2TexelScale_PS + + grad_fold3.xy*In.blend_factor_cascade0123.w*g_Cascade3TexelScale_PS; - float nvsf_c2c_scale = 0.25; // larger cascaded cover larger areas, so foamed texels cover larger area, thus, foam intensity on these needs to be scaled down for uniform foam look + float c2c_scale = 0.25; // larger cascaded cover larger areas, so foamed texels cover larger area, thus, foam intensity on these needs to be scaled down for uniform foam look - float nvsf_foam_turbulent_energy = + float foam_turbulent_energy = // accumulated foam energy with blendfactors - 100.0*nvsf_grad_fold0.w * - lerp(nvsf_c2c_scale, nvsf_grad_fold1.w, In.nvsf_blend_factor_cascade0123.y)* - lerp(nvsf_c2c_scale, nvsf_grad_fold2.w, In.nvsf_blend_factor_cascade0123.z)* - lerp(nvsf_c2c_scale, nvsf_grad_fold3.w, In.nvsf_blend_factor_cascade0123.w); + 100.0*grad_fold0.w * + lerp(c2c_scale, grad_fold1.w, In.blend_factor_cascade0123.y)* + lerp(c2c_scale, grad_fold2.w, In.blend_factor_cascade0123.z)* + lerp(c2c_scale, grad_fold3.w, In.blend_factor_cascade0123.w); - float nvsf_foam_surface_folding = + float foam_surface_folding = // folding for foam "clumping" on folded areas max(-100, - (1.0-nvsf_grad_fold0.z) + - (1.0-nvsf_grad_fold1.z) + - (1.0-nvsf_grad_fold2.z) + - (1.0-nvsf_grad_fold3.z)); + (1.0-grad_fold0.z) + + (1.0-grad_fold1.z) + + (1.0-grad_fold2.z) + + (1.0-grad_fold3.z)); // Calculate normal here. - float3 nvsf_normal = normalize(float3(nvsf_grad, nvsf_g_TexelLength_x2_PS)); + float3 normal = normalize(float3(grad, g_TexelLength_x2_PS)); - float nvsf_hats_c2c_scale = 0.5; // the larger is the wave, the higher is the chance to start breaking at high folding, so folding for smaller cascade s is decreased - float nvsf_foam_wave_hats = + float hats_c2c_scale = 0.5; // the larger is the wave, the higher is the chance to start breaking at high folding, so folding for smaller cascade s is decreased + float foam_wave_hats = 10.0*(-0.55 + // this allows hats to appear on breaking places only. Can be tweaked to represent Beaufort scale better - (1.0-nvsf_grad_fold0.z) + - nvsf_hats_c2c_scale*(1.0-nvsf_grad_fold1.z) + - nvsf_hats_c2c_scale*nvsf_hats_c2c_scale*(1.0-nvsf_grad_fold2.z) + - nvsf_hats_c2c_scale*nvsf_hats_c2c_scale*nvsf_hats_c2c_scale*(1.0-nvsf_grad_fold3.z)); + (1.0-grad_fold0.z) + + hats_c2c_scale*(1.0-grad_fold1.z) + + hats_c2c_scale*hats_c2c_scale*(1.0-grad_fold2.z) + + hats_c2c_scale*hats_c2c_scale*hats_c2c_scale*(1.0-grad_fold3.z)); // Output GFSDK_WAVEWORKS_SURFACE_ATTRIBUTES Output; - Output.normal = nvsf_normal; - Output.eye_dir = nvsf_eye_dir; - Output.foam_surface_folding = nvsf_foam_surface_folding; - Output.foam_turbulent_energy = log(1.0 + nvsf_foam_turbulent_energy); - Output.foam_wave_hats = nvsf_foam_wave_hats; + Output.normal = normal; + Output.eye_dir = eye_dir; + Output.foam_surface_folding = foam_surface_folding; + Output.foam_turbulent_energy = log(1.0 + foam_turbulent_energy); + Output.foam_wave_hats = foam_wave_hats; return Output; } diff --git a/include/GFSDK_WaveWorks_Common.fxh b/include/GFSDK_WaveWorks_Common.fxh index c100c8b..8b13250 100644 --- a/include/GFSDK_WaveWorks_Common.fxh +++ b/include/GFSDK_WaveWorks_Common.fxh @@ -34,30 +34,30 @@ * */ #if defined(GFSDK_WAVEWORKS_SM4) || defined(GFSDK_WAVEWORKS_SM5) - #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) nvsf_texture.Sample(nvsf_sampler,nvsf_coords) - #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) nvsf_texture.SampleLevel(nvsf_sampler,nvsf_coords,nvsf_lod) + #define SampleTex2D(texture,sampler,coords) texture.Sample(sampler,coords) + #define SampleTex2Dlod(texture,sampler,coords,lod) texture.SampleLevel(sampler,coords,lod) #define BEGIN_CBUFFER(name,slot) cbuffer name : register(b##slot) { #define END_CBUFFER }; #define SEMANTIC(x) : x #elif defined(GFSDK_WAVEWORKS_SM3) - #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) tex2D(nvsf_sampler,nvsf_coords) - #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) tex2Dlod(nvsf_sampler,float4(nvsf_coords,0,nvsf_lod)) + #define SampleTex2D(texture,sampler,coords) tex2D(sampler,coords) + #define SampleTex2Dlod(texture,sampler,coords,lod) tex2Dlod(sampler,float4(coords,0,lod)) #define BEGIN_CBUFFER(name,slot) #define END_CBUFFER #define SV_Target COLOR #define SV_Position POSITION #define SEMANTIC(x) : x #elif defined(GFSDK_WAVEWORKS_GNM) - #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) nvsf_texture.Sample(nvsf_sampler,nvsf_coords) - #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) nvsf_texture.SampleLOD(nvsf_sampler,nvsf_coords,nvsf_lod) + #define SampleTex2D(texture,sampler,coords) texture.Sample(sampler,coords) + #define SampleTex2Dlod(texture,sampler,coords,lod) texture.SampleLOD(sampler,coords,lod) #define BEGIN_CBUFFER(name,slot) ConstantBuffer name : register(b##slot) { #define END_CBUFFER }; #define SV_Target S_TARGET_OUTPUT #define SV_Position S_POSITION #define SEMANTIC(x) : x #elif defined(GFSDK_WAVEWORKS_GL) - #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) texture(nvsf_sampler,nvsf_coords) - #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) textureLod(nvsf_sampler,nvsf_coords,nvsf_lod) + #define SampleTex2D(texture,sampler,coords) texture(sampler,coords) + #define SampleTex2Dlod(texture,sampler,coords,lod) textureLod(sampler,coords,lod) #define BEGIN_CBUFFER(name,slot) #define END_CBUFFER #define SEMANTIC(x) diff --git a/include/GFSDK_WaveWorks_Quadtree.fxh b/include/GFSDK_WaveWorks_Quadtree.fxh index b06e437..a3d5fc0 100644 --- a/include/GFSDK_WaveWorks_Quadtree.fxh +++ b/include/GFSDK_WaveWorks_Quadtree.fxh @@ -40,78 +40,78 @@ #endif #if defined( GFSDK_WAVEWORKS_USE_TESSELLATION ) - GFSDK_WAVEWORKS_BEGIN_GEOM_HS_CBUFFER(nvsf_eyepos_buffer) - GFSDK_WAVEWORKS_DECLARE_GEOM_HS_CONSTANT(float4, nvsf_g_hsWorldEye, 0) - GFSDK_WAVEWORKS_DECLARE_GEOM_HS_CONSTANT(float4, nvsf_g_tessellationParams, 1) + GFSDK_WAVEWORKS_BEGIN_GEOM_HS_CBUFFER(eyepos_buffer) + GFSDK_WAVEWORKS_DECLARE_GEOM_HS_CONSTANT(float4, g_hsWorldEye, 0) + GFSDK_WAVEWORKS_DECLARE_GEOM_HS_CONSTANT(float4, g_tessellationParams, 1) GFSDK_WAVEWORKS_END_GEOM_HS_CBUFFER #endif -GFSDK_WAVEWORKS_BEGIN_GEOM_VS_CBUFFER(nvsf_geom_buffer) -GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4x3, nvsf_g_matLocalWorld, 0) -GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4, nvsf_g_vsEyePos, 3) -GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4, nvsf_g_MorphParam, 4) +GFSDK_WAVEWORKS_BEGIN_GEOM_VS_CBUFFER(geom_buffer) +GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4x3, g_matLocalWorld, 0) +GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4, g_vsEyePos, 3) +GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4, g_MorphParam, 4) GFSDK_WAVEWORKS_END_GEOM_VS_CBUFFER struct GFSDK_WAVEWORKS_VERTEX_INPUT { - float4 nvsf_vPos SEMANTIC(POSITION); + float4 vPos SEMANTIC(POSITION); }; #if !defined(GFSDK_WAVEWORKS_USE_TESSELLATION) float3 GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(GFSDK_WAVEWORKS_VERTEX_INPUT In) { - float2 nvsf_vpos = In.nvsf_vPos.xy; + float2 vpos = In.vPos.xy; // Use multiple levels of geo-morphing to smooth away LOD boundaries - float nvsf_geomorph_scale = 0.25f; + float geomorph_scale = 0.25f; - float2 nvsf_geomorph_offset = float2(nvsf_g_MorphParam.w,nvsf_g_MorphParam.w); - float2 nvsf_vpos_src = nvsf_vpos; - float2 nvsf_vpos_target = nvsf_vpos_src; - float nvsf_geomorph_amount = 0.f; + float2 geomorph_offset = float2(g_MorphParam.w,g_MorphParam.w); + float2 vpos_src = vpos; + float2 vpos_target = vpos_src; + float geomorph_amount = 0.f; - for(int nvsf_geomorph_level = 0; nvsf_geomorph_level != 4; ++nvsf_geomorph_level) { + for(int geomorph_level = 0; geomorph_level != 4; ++geomorph_level) { - float2 nvsf_intpart; - float2 nvsf_rempart = modf(nvsf_geomorph_scale*nvsf_vpos_src.xy,nvsf_intpart); + float2 intpart; + float2 rempart = modf(geomorph_scale*vpos_src.xy,intpart); - float2 nvsf_mirror = float2(1.0f, 1.0f); + float2 mirror = float2(1.0f, 1.0f); - if(nvsf_rempart.x > 0.5f) + if(rempart.x > 0.5f) { - nvsf_rempart.x = 1.0f - nvsf_rempart.x; - nvsf_mirror.x = -nvsf_mirror.x; + rempart.x = 1.0f - rempart.x; + mirror.x = -mirror.x; } - if(nvsf_rempart.y > 0.5f) + if(rempart.y > 0.5f) { - nvsf_rempart.y = 1.0f - nvsf_rempart.y; - nvsf_mirror.y = -nvsf_mirror.y; + rempart.y = 1.0f - rempart.y; + mirror.y = -mirror.y; } - if(0.25f == nvsf_rempart.x && 0.25f == nvsf_rempart.y) nvsf_vpos_target.xy = nvsf_vpos_src.xy - nvsf_geomorph_offset*nvsf_mirror; - else if(0.25f == nvsf_rempart.x) nvsf_vpos_target.x = nvsf_vpos_src.x + nvsf_geomorph_offset.x*nvsf_mirror.x; - else if(0.25f == nvsf_rempart.y) nvsf_vpos_target.y = nvsf_vpos_src.y + nvsf_geomorph_offset.y*nvsf_mirror.y; + if(0.25f == rempart.x && 0.25f == rempart.y) vpos_target.xy = vpos_src.xy - geomorph_offset*mirror; + else if(0.25f == rempart.x) vpos_target.x = vpos_src.x + geomorph_offset.x*mirror.x; + else if(0.25f == rempart.y) vpos_target.y = vpos_src.y + geomorph_offset.y*mirror.y; - float3 nvsf_eyevec = mul(float4(nvsf_vpos_target,0.f,1.f), nvsf_g_matLocalWorld) - nvsf_g_vsEyePos.xyz; - float nvsf_d = length(nvsf_eyevec); - float nvsf_geomorph_target_level = log2(nvsf_d * nvsf_g_MorphParam.x) + 1.f; - nvsf_geomorph_amount = saturate(2.0*(nvsf_geomorph_target_level - float(nvsf_geomorph_level))); - if(nvsf_geomorph_amount < 1.f) + float3 eyevec = mul(float4(vpos_target,0.f,1.f), g_matLocalWorld) - g_vsEyePos.xyz; + float d = length(eyevec); + float geomorph_target_level = log2(d * g_MorphParam.x) + 1.f; + geomorph_amount = saturate(2.0*(geomorph_target_level - float(geomorph_level))); + if(geomorph_amount < 1.f) { break; } else { - nvsf_vpos_src = nvsf_vpos_target; - nvsf_geomorph_scale *= 0.5f; - nvsf_geomorph_offset *= -2.f; + vpos_src = vpos_target; + geomorph_scale *= 0.5f; + geomorph_offset *= -2.f; } } - nvsf_vpos.xy = lerp(nvsf_vpos_src, nvsf_vpos_target, nvsf_geomorph_amount); - return mul(float4(nvsf_vpos,In.nvsf_vPos.zw), nvsf_g_matLocalWorld); + vpos.xy = lerp(vpos_src, vpos_target, geomorph_amount); + return mul(float4(vpos,In.vPos.zw), g_matLocalWorld); } #endif @@ -119,59 +119,59 @@ float3 GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(GFSDK_WAVEWORKS_VERTEX_ #if defined(GFSDK_WAVEWORKS_USE_TESSELLATION) float3 GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(GFSDK_WAVEWORKS_VERTEX_INPUT In) { - float2 nvsf_vpos = In.nvsf_vPos.xy; + float2 vpos = In.vPos.xy; // Use multiple levels of geo-morphing to smooth away LOD boundaries - float nvsf_geomorph_scale = 0.5f; - float nvsf_geomorph_offset = abs(nvsf_g_MorphParam.w); - float2 nvsf_vpos_src = nvsf_vpos; - float2 nvsf_vpos_target = nvsf_vpos_src; - float nvsf_geomorph_amount = 0.f; + float geomorph_scale = 0.5f; + float geomorph_offset = abs(g_MorphParam.w); + float2 vpos_src = vpos; + float2 vpos_target = vpos_src; + float geomorph_amount = 0.f; - //nvsf_vpos_target.x += 0.25*nvsf_geomorph_offset; - //nvsf_vpos_src.x += 0.25*nvsf_geomorph_offset; + //vpos_target.x += 0.25*geomorph_offset; + //vpos_src.x += 0.25*geomorph_offset; - for(int nvsf_geomorph_level = 0; nvsf_geomorph_level != 4; ++nvsf_geomorph_level) { + for(int geomorph_level = 0; geomorph_level != 4; ++geomorph_level) { - float2 nvsf_intpart; - float2 nvsf_rempart = modf(nvsf_geomorph_scale*nvsf_vpos_src.xy,nvsf_intpart); - if(0.5f == nvsf_rempart.x) + float2 intpart; + float2 rempart = modf(geomorph_scale*vpos_src.xy,intpart); + if(0.5f == rempart.x) { - nvsf_vpos_target.x = nvsf_vpos_src.x + nvsf_geomorph_offset; + vpos_target.x = vpos_src.x + geomorph_offset; } - if(0.5f == nvsf_rempart.y) + if(0.5f == rempart.y) { - nvsf_vpos_target.y = nvsf_vpos_src.y + nvsf_geomorph_offset; + vpos_target.y = vpos_src.y + geomorph_offset; } - float3 nvsf_eyevec = mul(float4(nvsf_vpos_target,0.f,1.f), nvsf_g_matLocalWorld) - nvsf_g_vsEyePos.xyz; - float nvsf_d = length(nvsf_eyevec); - float nvsf_geomorph_target_level = log2(nvsf_d * nvsf_g_MorphParam.x) + 1.f; - nvsf_geomorph_amount = saturate(3.0*(nvsf_geomorph_target_level - float(nvsf_geomorph_level))); - if(nvsf_geomorph_amount < 1.f) { + float3 eyevec = mul(float4(vpos_target,0.f,1.f), g_matLocalWorld) - g_vsEyePos.xyz; + float d = length(eyevec); + float geomorph_target_level = log2(d * g_MorphParam.x) + 1.f; + geomorph_amount = saturate(3.0*(geomorph_target_level - float(geomorph_level))); + if(geomorph_amount < 1.f) { break; } else { - nvsf_vpos_src = nvsf_vpos_target; - nvsf_geomorph_scale *= 0.5f; - nvsf_geomorph_offset *= 2.f; + vpos_src = vpos_target; + geomorph_scale *= 0.5f; + geomorph_offset *= 2.f; } } - nvsf_vpos.xy = lerp(nvsf_vpos_src, nvsf_vpos_target, nvsf_geomorph_amount); - return mul(float4(nvsf_vpos,In.nvsf_vPos.zw), nvsf_g_matLocalWorld); + vpos.xy = lerp(vpos_src, vpos_target, geomorph_amount); + return mul(float4(vpos,In.vPos.zw), g_matLocalWorld); } float GFSDK_WaveWorks_GetEdgeTessellationFactor(float4 vertex1, float4 vertex2) { - float3 nvsf_edge_center = 0.5*(vertex1.xyz + vertex2.xyz); - float nvsf_edge_length = length (vertex1.xyz - vertex2.xyz); - float nvsf_edge_distance = length(nvsf_g_hsWorldEye.xyz - nvsf_edge_center.xyz); - return nvsf_g_tessellationParams.x * nvsf_edge_length / nvsf_edge_distance; + float3 edge_center = 0.5*(vertex1.xyz + vertex2.xyz); + float edge_length = length (vertex1.xyz - vertex2.xyz); + float edge_distance = length(g_hsWorldEye.xyz - edge_center.xyz); + return g_tessellationParams.x * edge_length / edge_distance; } float GFSDK_WaveWorks_GetVertexTargetTessellatedEdgeLength(float3 vertex) { - float nvsf_vertex_distance = length(nvsf_g_hsWorldEye.xyz - vertex.xyz); - return nvsf_vertex_distance / nvsf_g_tessellationParams.x; + float vertex_distance = length(g_hsWorldEye.xyz - vertex.xyz); + return vertex_distance / g_tessellationParams.x; } #endif diff --git a/media/sample/ocean_surface_d3d11.fxo b/media/sample/ocean_surface_d3d11.fxo Binary files differindex d35f8db..3de4125 100644 --- a/media/sample/ocean_surface_d3d11.fxo +++ b/media/sample/ocean_surface_d3d11.fxo diff --git a/media/test/ocean_surface_d3d11.fxo b/media/test/ocean_surface_d3d11.fxo Binary files differindex 2e18509..87bcd55 100644 --- a/media/test/ocean_surface_d3d11.fxo +++ b/media/test/ocean_surface_d3d11.fxo diff --git a/src/Internal.h b/src/Internal.h index d8f64ef..a7a73e7 100644 --- a/src/Internal.h +++ b/src/Internal.h @@ -414,7 +414,7 @@ void handle_hr_error(HRESULT hr, const char_type* file, int line); #endif #ifdef TARGET_PLATFORM_WINDOWS -//#define WAVEWORKS_ENABLE_GL WAVEWORKS_ALLOW_GFX +#define WAVEWORKS_ENABLE_GL WAVEWORKS_ALLOW_GFX #else #ifdef TARGET_PLATFORM_MACOSX #define WAVEWORKS_ENABLE_GL WAVEWORKS_ALLOW_GFX diff --git a/src/Quadtree.cpp b/src/Quadtree.cpp index 7f132db..9e0acd8 100644 --- a/src/Quadtree.cpp +++ b/src/Quadtree.cpp @@ -96,24 +96,24 @@ enum ShaderInputsGL2 #if WAVEWORKS_ENABLE_D3D11 const GFSDK_WaveWorks_ShaderInput_Desc ShaderInputD3D11Descs[NumShaderInputsD3D11] = { - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "nvsf_geom_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::HullShader_ConstantBuffer, "nvsf_eyepos_buffer", 0 } + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "geom_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::HullShader_ConstantBuffer, "eyepos_buffer", 0 } }; #endif #if WAVEWORKS_ENABLE_GNM const GFSDK_WaveWorks_ShaderInput_Desc ShaderInputGnmDescs[NumShaderInputsGnm] = { - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "nvsf_geom_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::HullShader_ConstantBuffer, "nvsf_eyepos_buffer", 0 } + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "geom_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::HullShader_ConstantBuffer, "eyepos_buffer", 0 } }; #endif #if WAVEWORKS_ENABLE_GL const GFSDK_WaveWorks_ShaderInput_Desc ShaderInputGL2Descs[NumShaderInputsGL2] = { - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "nvsf_g_matLocalWorld", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "nvsf_g_vsEyePos", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "nvsf_g_MorphParam", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_AttribLocation, "nvsf_vPos", 0 } + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "g_matLocalWorld", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "g_vsEyePos", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "g_MorphParam", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_AttribLocation, "vPos", 0 } }; #endif struct vs_cbuffer diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 039d191..146fc7d 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -242,92 +242,92 @@ enum ShaderInputsGL2 #if WAVEWORKS_ENABLE_D3D11 const GFSDK_WaveWorks_ShaderInput_Desc ShaderInputDescsD3D11[NumShaderInputsD3D11] = { - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "nvsf_attr_vs_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_ConstantBuffer, "nvsf_attr_vs_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_ConstantBuffer, "nvsf_attr_ps_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap3", 3 } + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "attr_vs_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_ConstantBuffer, "attr_vs_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_ConstantBuffer, "attr_ps_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap3", 3 } }; #endif // WAVEWORKS_ENABLE_D3D11 #if WAVEWORKS_ENABLE_GNM const GFSDK_WaveWorks_ShaderInput_Desc ShaderInputDescsGnm[NumShaderInputsGnm] = { - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "nvsf_attr_vs_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "nvsf_g_samplerDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "nvsf_g_textureDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_ConstantBuffer, "nvsf_attr_vs_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "nvsf_g_samplerDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "nvsf_g_textureDisplacementMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_ConstantBuffer, "nvsf_attr_ps_buffer", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "nvsf_g_samplerGradientMap3", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap1", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap2", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "nvsf_g_textureGradientMap3", 3 } + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_ConstantBuffer, "attr_vs_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Sampler, "g_samplerDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::VertexShader_Texture, "g_textureDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_ConstantBuffer, "attr_vs_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Sampler, "g_samplerDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::DomainShader_Texture, "g_textureDisplacementMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_ConstantBuffer, "attr_ps_buffer", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Sampler, "g_samplerGradientMap3", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap1", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap2", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::PixelShader_Texture, "g_textureGradientMap3", 3 } }; #endif // WAVEWORKS_ENABLE_GNM #if WAVEWORKS_ENABLE_GL const GFSDK_WaveWorks_ShaderInput_Desc ShaderInputDescsGL2[NumShaderInputsGL2] = { - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "nvsf_g_samplerDisplacementMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "nvsf_g_samplerDisplacementMap1", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "nvsf_g_samplerDisplacementMap2", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "nvsf_g_samplerDisplacementMap3", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "nvsf_g_samplerGradientMap0", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "nvsf_g_samplerGradientMap1", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "nvsf_g_samplerGradientMap2", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "nvsf_g_samplerGradientMap3", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureArrayBindLocation, "nvsf_g_samplerDisplacementMapTextureArray", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureArrayBindLocation, "nvsf_g_samplerGradientMapTextureArray", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "nvsf_g_WorldEye", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "nvsf_g_UseTextureArrays", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "nvsf_g_UVScaleCascade0123", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_TexelLength_x2_PS", 0 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade1Scale_PS", 1 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade1TexelScale_PS", 2 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade1UVOffset_PS", 3 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade2Scale_PS", 4 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade2TexelScale_PS", 5 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade2UVOffset_PS", 6 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade3Scale_PS", 7 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade3TexelScale_PS", 8 }, - { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "nvsf_g_Cascade3UVOffset_PS", 9 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "g_samplerDisplacementMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "g_samplerDisplacementMap1", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "g_samplerDisplacementMap2", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureBindLocation, "g_samplerDisplacementMap3", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "g_samplerGradientMap0", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "g_samplerGradientMap1", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "g_samplerGradientMap2", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureBindLocation, "g_samplerGradientMap3", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_TextureArrayBindLocation, "g_samplerDisplacementMapTextureArray", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_TextureArrayBindLocation, "g_samplerGradientMapTextureArray", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "g_WorldEye", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "g_UseTextureArrays", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_VertexShader_UniformLocation, "g_UVScaleCascade0123", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_TexelLength_x2_PS", 0 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade1Scale_PS", 1 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade1TexelScale_PS", 2 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade1UVOffset_PS", 3 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade2Scale_PS", 4 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade2TexelScale_PS", 5 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade2UVOffset_PS", 6 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade3Scale_PS", 7 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade3TexelScale_PS", 8 }, + { GFSDK_WaveWorks_ShaderInput_Desc::GL_FragmentShader_UniformLocation, "g_Cascade3UVOffset_PS", 9 }, }; #endif // __GL__ struct ps_calcgradient_cbuffer @@ -353,10 +353,10 @@ struct vs_attr_cbuffer struct ps_foamgeneration_cbuffer { - float nvsf_g_DissipationFactors_BlurExtents; - float nvsf_g_DissipationFactors_Fadeout; - float nvsf_g_DissipationFactors_Accumulation; - float nvsf_g_FoamGenerationThreshold; + float g_DissipationFactors_BlurExtents; + float g_DissipationFactors_Fadeout; + float g_DissipationFactors_Accumulation; + float g_FoamGenerationThreshold; gfsdk_float4 g_SourceComponents; gfsdk_float4 g_UVOffsets; }; @@ -772,15 +772,15 @@ HRESULT GFSDK_WaveWorks_Simulation::initShaders() if(m_d3d._GL2.m_GradCalcProgram == 0) return E_FAIL; // Gradient calculation program binding - m_d3d._GL2.m_GradCalcUniformLocation_Scales = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"nvsf_g_Scales"); CHECK_GL_ERRORS; - m_d3d._GL2.m_GradCalcUniformLocation_OneBack = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"nvsf_g_OneTexel_Back"); CHECK_GL_ERRORS; - m_d3d._GL2.m_GradCalcUniformLocation_OneFront = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"nvsf_g_OneTexel_Front"); CHECK_GL_ERRORS; - m_d3d._GL2.m_GradCalcUniformLocation_OneLeft = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"nvsf_g_OneTexel_Left"); CHECK_GL_ERRORS; - m_d3d._GL2.m_GradCalcUniformLocation_OneRight = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"nvsf_g_OneTexel_Right"); CHECK_GL_ERRORS; - m_d3d._GL2.m_GradCalcTextureBindLocation_DisplacementMap = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"nvsf_g_samplerDisplacementMap"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcUniformLocation_Scales = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"g_Scales"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcUniformLocation_OneBack = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"g_OneTexel_Back"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcUniformLocation_OneFront = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"g_OneTexel_Front"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcUniformLocation_OneLeft = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"g_OneTexel_Left"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcUniformLocation_OneRight = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"g_OneTexel_Right"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcTextureBindLocation_DisplacementMap = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_GradCalcProgram,"g_samplerDisplacementMap"); CHECK_GL_ERRORS; m_d3d._GL2.m_GradCalcTextureUnit_DisplacementMap = 0; - m_d3d._GL2.m_GradCalcAttributeLocation_Pos = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_GradCalcProgram, "nvsf_vInPos"); CHECK_GL_ERRORS; - m_d3d._GL2.m_GradCalcAttributeLocation_TexCoord = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_GradCalcProgram, "nvsf_vInTexCoord"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcAttributeLocation_Pos = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_GradCalcProgram, "vInPos"); CHECK_GL_ERRORS; + m_d3d._GL2.m_GradCalcAttributeLocation_TexCoord = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_GradCalcProgram, "vInTexCoord"); CHECK_GL_ERRORS; // Creating foam generation program if(m_d3d._GL2.m_FoamGenProgram != 0) NVSDK_GLFunctions.glDeleteProgram(m_d3d._GL2.m_FoamGenProgram); CHECK_GL_ERRORS; @@ -788,13 +788,13 @@ HRESULT GFSDK_WaveWorks_Simulation::initShaders() if(m_d3d._GL2.m_FoamGenProgram == 0) return E_FAIL; // Foam accumulation program binding - m_d3d._GL2.m_FoamGenUniformLocation_DissipationFactors = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"nvsf_g_DissipationFactors"); CHECK_GL_ERRORS; - m_d3d._GL2.m_FoamGenUniformLocation_SourceComponents = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"nvsf_g_SourceComponents"); CHECK_GL_ERRORS; - m_d3d._GL2.m_FoamGenUniformLocation_UVOffsets = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"nvsf_g_UVOffsets"); CHECK_GL_ERRORS; - m_d3d._GL2.m_FoamGenTextureBindLocation_EnergyMap = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"nvsf_g_samplerEnergyMap"); CHECK_GL_ERRORS; + m_d3d._GL2.m_FoamGenUniformLocation_DissipationFactors = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"g_DissipationFactors"); CHECK_GL_ERRORS; + m_d3d._GL2.m_FoamGenUniformLocation_SourceComponents = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"g_SourceComponents"); CHECK_GL_ERRORS; + m_d3d._GL2.m_FoamGenUniformLocation_UVOffsets = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"g_UVOffsets"); CHECK_GL_ERRORS; + m_d3d._GL2.m_FoamGenTextureBindLocation_EnergyMap = NVSDK_GLFunctions.glGetUniformLocation(m_d3d._GL2.m_FoamGenProgram,"g_samplerEnergyMap"); CHECK_GL_ERRORS; m_d3d._GL2.m_FoamGenTextureUnit_EnergyMap = 0; - m_d3d._GL2.m_FoamGenAttributeLocation_Pos = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_FoamGenProgram, "nvsf_vInPos"); CHECK_GL_ERRORS; - m_d3d._GL2.m_FoamGenAttributeLocation_TexCoord = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_FoamGenProgram, "nvsf_vInTexCoord"); CHECK_GL_ERRORS; + m_d3d._GL2.m_FoamGenAttributeLocation_Pos = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_FoamGenProgram, "vInPos"); CHECK_GL_ERRORS; + m_d3d._GL2.m_FoamGenAttributeLocation_TexCoord = NVSDK_GLFunctions.glGetAttribLocation(m_d3d._GL2.m_FoamGenProgram, "vInTexCoord"); CHECK_GL_ERRORS; } break; #endif @@ -1457,10 +1457,10 @@ HRESULT GFSDK_WaveWorks_Simulation::updateGradientMapsD3D11(Graphics_Context* pG D3D11_CB_Updater<ps_foamgeneration_cbuffer> cbu(pDC_d3d11,m_d3d._11.m_pd3d11FoamGenPixelShaderCB); cbu.cb().g_SourceComponents = gfsdk_make_float4(0,0,0.0f,1.0f); // getting component W of grad map as source for energy cbu.cb().g_UVOffsets = gfsdk_make_float4(0,1.0f,0,0); // blurring by Y - cbu.cb().nvsf_g_DissipationFactors_Accumulation = m_params.cascades[cascade].foam_generation_amount*(float)m_dFoamSimDeltaTime*50.0f; - cbu.cb().nvsf_g_DissipationFactors_Fadeout = pow(m_params.cascades[cascade].foam_falloff_speed,(float)m_dFoamSimDeltaTime*50.0f); - cbu.cb().nvsf_g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime*m_params.cascades[0].fft_period * (1000.0f/m_params.cascades[0].fft_period)/m_params.cascades[cascade].fft_period)/dmap_dim; - cbu.cb().nvsf_g_FoamGenerationThreshold = m_params.cascades[cascade].foam_generation_threshold; + cbu.cb().g_DissipationFactors_Accumulation = m_params.cascades[cascade].foam_generation_amount*(float)m_dFoamSimDeltaTime*50.0f; + cbu.cb().g_DissipationFactors_Fadeout = pow(m_params.cascades[cascade].foam_falloff_speed,(float)m_dFoamSimDeltaTime*50.0f); + cbu.cb().g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime*m_params.cascades[0].fft_period * (1000.0f/m_params.cascades[0].fft_period)/m_params.cascades[cascade].fft_period)/dmap_dim; + cbu.cb().g_FoamGenerationThreshold = m_params.cascades[cascade].foam_generation_threshold; } pDC_d3d11->PSSetConstantBuffers(0, 1, &m_d3d._11.m_pd3d11FoamGenPixelShaderCB); @@ -1507,10 +1507,10 @@ HRESULT GFSDK_WaveWorks_Simulation::updateGradientMapsD3D11(Graphics_Context* pG D3D11_CB_Updater<ps_foamgeneration_cbuffer> cbu(pDC_d3d11,m_d3d._11.m_pd3d11FoamGenPixelShaderCB); cbu.cb().g_SourceComponents = gfsdk_make_float4(1.0f,0,0,0); // getting component R of energy map as source for energy cbu.cb().g_UVOffsets = gfsdk_make_float4(1.0f,0,0,0); // blurring by X - cbu.cb().nvsf_g_DissipationFactors_Accumulation = 0.0f; - cbu.cb().nvsf_g_DissipationFactors_Fadeout = 1.0f; - cbu.cb().nvsf_g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime* (1000.0f/m_params.cascades[0].fft_period) * m_params.cascades[0].fft_period/m_params.cascades[cascade].fft_period)/dmap_dim; - cbu.cb().nvsf_g_FoamGenerationThreshold = m_params.cascades[cascade].foam_generation_threshold; + cbu.cb().g_DissipationFactors_Accumulation = 0.0f; + cbu.cb().g_DissipationFactors_Fadeout = 1.0f; + cbu.cb().g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime* (1000.0f/m_params.cascades[0].fft_period) * m_params.cascades[0].fft_period/m_params.cascades[cascade].fft_period)/dmap_dim; + cbu.cb().g_FoamGenerationThreshold = m_params.cascades[cascade].foam_generation_threshold; } pDC_d3d11->PSSetConstantBuffers(0, 1, &m_d3d._11.m_pd3d11FoamGenPixelShaderCB); @@ -1840,10 +1840,10 @@ HRESULT GFSDK_WaveWorks_Simulation::updateGradientMapsGnm(Graphics_Context* GNM_ ps_foamgeneration_cbuffer* pFGCB = (ps_foamgeneration_cbuffer*)gnmxWrap->allocateFromCommandBuffer(*gfxContext, sizeof(ps_foamgeneration_cbuffer), Gnm::kEmbeddedDataAlignment4); pFGCB->g_SourceComponents = gfsdk_make_float4(0,0,0.0f,1.0f); // getting component W of grad map as source for energy pFGCB->g_UVOffsets = gfsdk_make_float4(0,1.0f,0,0); // blurring by Y - pFGCB->nvsf_g_DissipationFactors_Accumulation = m_params.cascades[cascade].foam_generation_amount*(float)m_dFoamSimDeltaTime*50.0f; - pFGCB->nvsf_g_DissipationFactors_Fadeout = pow(m_params.cascades[cascade].foam_falloff_speed,(float)m_dFoamSimDeltaTime*50.0f); - pFGCB->nvsf_g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime*m_params.cascades[0].fft_period * (1000.0f/m_params.cascades[0].fft_period)/m_params.cascades[cascade].fft_period)/dmap_dim; - pFGCB->nvsf_g_FoamGenerationThreshold = m_params.cascades[cascade].foam_generation_threshold; + pFGCB->g_DissipationFactors_Accumulation = m_params.cascades[cascade].foam_generation_amount*(float)m_dFoamSimDeltaTime*50.0f; + pFGCB->g_DissipationFactors_Fadeout = pow(m_params.cascades[cascade].foam_falloff_speed,(float)m_dFoamSimDeltaTime*50.0f); + pFGCB->g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime*m_params.cascades[0].fft_period * (1000.0f/m_params.cascades[0].fft_period)/m_params.cascades[cascade].fft_period)/dmap_dim; + pFGCB->g_FoamGenerationThreshold = m_params.cascades[cascade].foam_generation_threshold; Gnm::Buffer buffer; buffer.initAsConstantBuffer(pFGCB, sizeof(*pFGCB)); @@ -1891,9 +1891,9 @@ HRESULT GFSDK_WaveWorks_Simulation::updateGradientMapsGnm(Graphics_Context* GNM_ ps_foamgeneration_cbuffer* pFGCB = (ps_foamgeneration_cbuffer*)gnmxWrap->allocateFromCommandBuffer(*gfxContext, sizeof(ps_foamgeneration_cbuffer), Gnm::kEmbeddedDataAlignment4); pFGCB->g_SourceComponents = gfsdk_make_float4(1.0f,0,0,0); // getting component R of energy map as source for energy pFGCB->g_UVOffsets = gfsdk_make_float4(1.0f,0,0,0); // blurring by X - pFGCB->nvsf_g_DissipationFactors_Accumulation = 0.0f; - pFGCB->nvsf_g_DissipationFactors_Fadeout = 1.0f; - pFGCB->nvsf_g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime* (1000.0f/m_params.cascades[0].fft_period) * m_params.cascades[0].fft_period/m_params.cascades[cascade].fft_period)/dmap_dim; + pFGCB->g_DissipationFactors_Accumulation = 0.0f; + pFGCB->g_DissipationFactors_Fadeout = 1.0f; + pFGCB->g_DissipationFactors_BlurExtents = min(0.5f,m_params.cascades[cascade].foam_dissipation_speed*(float)m_dFoamSimDeltaTime* (1000.0f/m_params.cascades[0].fft_period) * m_params.cascades[0].fft_period/m_params.cascades[cascade].fft_period)/dmap_dim; Gnm::Buffer buffer; buffer.initAsConstantBuffer(pFGCB, sizeof(*pFGCB)); diff --git a/src/shader/CalcGradient.fx b/src/shader/CalcGradient.fx index 58ffd3e..f2526a9 100644 --- a/src/shader/CalcGradient.fx +++ b/src/shader/CalcGradient.fx @@ -43,41 +43,41 @@ // Global variables //------------------------------------------------------------------------------------ -BEGIN_CBUFFER(nvsf_globals,0) -DECLARE_ATTR_CONSTANT(float4,nvsf_g_Scales, 0); // was: float nvsf_g_ChoppyScale, nvsf_g_GradMap2TexelWSScale -DECLARE_ATTR_CONSTANT(float4,nvsf_g_OneTexel_Left, 1); -DECLARE_ATTR_CONSTANT(float4,nvsf_g_OneTexel_Right,2); -DECLARE_ATTR_CONSTANT(float4,nvsf_g_OneTexel_Back, 3); -DECLARE_ATTR_CONSTANT(float4,nvsf_g_OneTexel_Front,4); +BEGIN_CBUFFER(globals,0) +DECLARE_ATTR_CONSTANT(float4,g_Scales, 0); // was: float g_ChoppyScale, g_GradMap2TexelWSScale +DECLARE_ATTR_CONSTANT(float4,g_OneTexel_Left, 1); +DECLARE_ATTR_CONSTANT(float4,g_OneTexel_Right,2); +DECLARE_ATTR_CONSTANT(float4,g_OneTexel_Back, 3); +DECLARE_ATTR_CONSTANT(float4,g_OneTexel_Front,4); END_CBUFFER -DECLARE_ATTR_SAMPLER(nvsf_g_textureDisplacementMap,nvsf_g_samplerDisplacementMap,0); +DECLARE_ATTR_SAMPLER(g_textureDisplacementMap,g_samplerDisplacementMap,0); #ifdef GFSDK_WAVEWORKS_GL -varying float2 nvsf_vInterpTexCoord; +varying float2 vInterpTexCoord; #endif #ifndef GFSDK_WAVEWORKS_OMIT_VS #ifdef GFSDK_WAVEWORKS_GL -attribute float4 nvsf_vInPos; -attribute float2 nvsf_vInTexCoord; -#define nvsf_vOutPos gl_Position +attribute float4 vInPos; +attribute float2 vInTexCoord; +#define vOutPos gl_Position void main() #else void vs( - float4 nvsf_vInPos SEMANTIC(POSITION), - float2 nvsf_vInTexCoord SEMANTIC(TEXCOORD0), - out float2 nvsf_vInterpTexCoord SEMANTIC(TEXCOORD0), - out float4 nvsf_vOutPos SEMANTIC(SV_Position) + float4 vInPos SEMANTIC(POSITION), + float2 vInTexCoord SEMANTIC(TEXCOORD0), + out float2 vInterpTexCoord SEMANTIC(TEXCOORD0), + out float4 vOutPos SEMANTIC(SV_Position) ) #endif { // No need to do matrix transform. - nvsf_vOutPos = nvsf_vInPos; + vOutPos = vInPos; // Pass through general texture coordinate. - nvsf_vInterpTexCoord = nvsf_vInTexCoord; + vInterpTexCoord = vInTexCoord; } #endif // !GFSDK_WAVEWORKS_OMIT_VS @@ -86,32 +86,32 @@ void vs( #ifndef GFSDK_WAVEWORKS_OMIT_PS #ifdef GFSDK_WAVEWORKS_GL -#define nvsf_Output gl_FragColor +#define Output gl_FragColor void main() #else void ps( - float2 nvsf_vInterpTexCoord SEMANTIC(TEXCOORD0), - out float4 nvsf_Output SEMANTIC(SV_Target) + float2 vInterpTexCoord SEMANTIC(TEXCOORD0), + out float4 Output SEMANTIC(SV_Target) ) #endif { // Sample neighbour texels - float3 nvsf_displace_left = SampleTex2D(nvsf_g_textureDisplacementMap, nvsf_g_samplerDisplacementMap, nvsf_vInterpTexCoord.xy + nvsf_g_OneTexel_Left.xy).rgb; - float3 nvsf_displace_right = SampleTex2D(nvsf_g_textureDisplacementMap, nvsf_g_samplerDisplacementMap, nvsf_vInterpTexCoord.xy + nvsf_g_OneTexel_Right.xy).rgb; - float3 nvsf_displace_back = SampleTex2D(nvsf_g_textureDisplacementMap, nvsf_g_samplerDisplacementMap, nvsf_vInterpTexCoord.xy + nvsf_g_OneTexel_Back.xy).rgb; - float3 nvsf_displace_front = SampleTex2D(nvsf_g_textureDisplacementMap, nvsf_g_samplerDisplacementMap, nvsf_vInterpTexCoord.xy + nvsf_g_OneTexel_Front.xy).rgb; + float3 displace_left = SampleTex2D(g_textureDisplacementMap, g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Left.xy).rgb; + float3 displace_right = SampleTex2D(g_textureDisplacementMap, g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Right.xy).rgb; + float3 displace_back = SampleTex2D(g_textureDisplacementMap, g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Back.xy).rgb; + float3 displace_front = SampleTex2D(g_textureDisplacementMap, g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Front.xy).rgb; // -------- Do not store the actual normal value, instead, it preserves two differential values. - float2 nvsf_gradient = float2(-(nvsf_displace_right.z - nvsf_displace_left.z) / max(0.01,1.0 + nvsf_g_Scales.y*(nvsf_displace_right.x - nvsf_displace_left.x)), -(nvsf_displace_front.z - nvsf_displace_back.z) / max(0.01,1.0+nvsf_g_Scales.y*(nvsf_displace_front.y - nvsf_displace_back.y))); - //float2 nvsf_gradient = {-(nvsf_displace_right.z - nvsf_displace_left.z), -(nvsf_displace_front.z - nvsf_displace_back.z) }; + float2 gradient = float2(-(displace_right.z - displace_left.z) / max(0.01,1.0 + g_Scales.y*(displace_right.x - displace_left.x)), -(displace_front.z - displace_back.z) / max(0.01,1.0+g_Scales.y*(displace_front.y - displace_back.y))); + //float2 gradient = {-(displace_right.z - displace_left.z), -(displace_front.z - displace_back.z) }; // Calculate Jacobian corelation from the partial differential of displacement field - float2 nvsf_Dx = (nvsf_displace_right.xy - nvsf_displace_left.xy) * nvsf_g_Scales.x; - float2 nvsf_Dy = (nvsf_displace_front.xy - nvsf_displace_back.xy) * nvsf_g_Scales.x; - float nvsf_J = (1.0f + nvsf_Dx.x) * (1.0f + nvsf_Dy.y) - nvsf_Dx.y * nvsf_Dy.x; + float2 Dx = (displace_right.xy - displace_left.xy) * g_Scales.x; + float2 Dy = (displace_front.xy - displace_back.xy) * g_Scales.x; + float J = (1.0f + Dx.x) * (1.0f + Dy.y) - Dx.y * Dy.x; // Output - nvsf_Output = float4(nvsf_gradient, nvsf_J, 0); + Output = float4(gradient, J, 0); } #endif // !GFSDK_WAVEWORKS_OMIT_PS diff --git a/src/shader/CalcGradient_glsl_ps.h b/src/shader/CalcGradient_glsl_ps.h new file mode 100644 index 0000000..2ef7ed8 --- /dev/null +++ b/src/shader/CalcGradient_glsl_ps.h @@ -0,0 +1,36 @@ +R"glsl( +//------------------------------------------------------------------------------------ +// Global variables +//------------------------------------------------------------------------------------ + +uniform vec4 g_Scales; +uniform vec4 g_OneTexel_Left; +uniform vec4 g_OneTexel_Right; +uniform vec4 g_OneTexel_Back; +uniform vec4 g_OneTexel_Front; + +uniform sampler2D g_samplerDisplacementMap; + +varying float2 vInterpTexCoord; + +void main() +{ + // Sample neighbour texels + float3 displace_left = texture(g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Left.xy).rgb; + float3 displace_right = texture(g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Right.xy).rgb; + float3 displace_back = texture(g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Back.xy).rgb; + float3 displace_front = texture(g_samplerDisplacementMap, vInterpTexCoord.xy + g_OneTexel_Front.xy).rgb; + + // -------- Do not store the actual normal value, instead, it preserves two differential values. + float2 gradient = float2(-(displace_right.z - displace_left.z) / max(0.01,1.0 + g_Scales.y*(displace_right.x - displace_left.x)), -(displace_front.z - displace_back.z) / max(0.01,1.0+g_Scales.y*(displace_front.y - displace_back.y))); + //float2 gradient = {-(displace_right.z - displace_left.z), -(displace_front.z - displace_back.z) }; + + // Calculate Jacobian corelation from the partial differential of displacement field + float2 Dx = (displace_right.xy - displace_left.xy) * g_Scales.x; + float2 Dy = (displace_front.xy - displace_back.xy) * g_Scales.x; + float J = (1.0f + Dx.x) * (1.0f + Dy.y) - Dx.y * Dy.x; + + // Output + gl_FragColor = float4(gradient, J, 0); +} +)glsl"; diff --git a/src/shader/CalcGradient_glsl_vs.h b/src/shader/CalcGradient_glsl_vs.h new file mode 100644 index 0000000..aa2747a --- /dev/null +++ b/src/shader/CalcGradient_glsl_vs.h @@ -0,0 +1,26 @@ +R"glsl( +//------------------------------------------------------------------------------------ +// Global variables +//------------------------------------------------------------------------------------ + +uniform vec4 g_Scales; +uniform vec4 g_OneTexel_Left; +uniform vec4 g_OneTexel_Right; +uniform vec4 g_OneTexel_Back; +uniform vec4 g_OneTexel_Front; + +uniform sampler2D g_textureDisplacementMap; + +varying float2 vInterpTexCoord; + +attribute float4 vInPos; +attribute float2 vInTexCoord; +void main() +{ + // No need to do matrix transform. + gl_Position = vInPos; + + // Pass through general texture coordinate. + vInterpTexCoord = vInTexCoord; +} +)glsl"; diff --git a/src/shader/FoamGeneration.fx b/src/shader/FoamGeneration.fx index 50a7007..a50e821 100644 --- a/src/shader/FoamGeneration.fx +++ b/src/shader/FoamGeneration.fx @@ -43,39 +43,39 @@ // Global variables //------------------------------------------------------------------------------------ -BEGIN_CBUFFER(nvsf_globals,0) -DECLARE_ATTR_CONSTANT(float4,nvsf_g_DissipationFactors,0); // x - the blur extents, y - the fadeout multiplier, z - the accumulation multiplier, w - foam generation threshold -DECLARE_ATTR_CONSTANT(float4,nvsf_g_SourceComponents ,1); // xyzw - weights of energy map components to be sampled -DECLARE_ATTR_CONSTANT(float4,nvsf_g_UVOffsets ,2); // xy - defines either horizontal offsets either vertical offsets +BEGIN_CBUFFER(globals,0) +DECLARE_ATTR_CONSTANT(float4,g_DissipationFactors,0); // x - the blur extents, y - the fadeout multiplier, z - the accumulation multiplier, w - foam generation threshold +DECLARE_ATTR_CONSTANT(float4,g_SourceComponents ,1); // xyzw - weights of energy map components to be sampled +DECLARE_ATTR_CONSTANT(float4,g_UVOffsets ,2); // xy - defines either horizontal offsets either vertical offsets END_CBUFFER -DECLARE_ATTR_SAMPLER(nvsf_g_textureEnergyMap,nvsf_g_samplerEnergyMap,0); +DECLARE_ATTR_SAMPLER(g_textureEnergyMap,g_samplerEnergyMap,0); #ifdef GFSDK_WAVEWORKS_GL -varying float2 nvsf_vInterpTexCoord; +varying float2 vInterpTexCoord; #endif #ifndef GFSDK_WAVEWORKS_OMIT_VS #ifdef GFSDK_WAVEWORKS_GL -attribute float4 nvsf_vInPos; -attribute float2 nvsf_vInTexCoord; -#define nvsf_vOutPos gl_Position +attribute float4 vInPos; +attribute float2 vInTexCoord; +#define vOutPos gl_Position void main() #else void vs( - float4 nvsf_vInPos SEMANTIC(POSITION), - float2 nvsf_vInTexCoord SEMANTIC(TEXCOORD0), - out float2 nvsf_vInterpTexCoord SEMANTIC(TEXCOORD0), - out float4 nvsf_vOutPos SEMANTIC(SV_Position) + float4 vInPos SEMANTIC(POSITION), + float2 vInTexCoord SEMANTIC(TEXCOORD0), + out float2 vInterpTexCoord SEMANTIC(TEXCOORD0), + out float4 vOutPos SEMANTIC(SV_Position) ) #endif { // No need to do matrix transform. - nvsf_vOutPos = nvsf_vInPos; + vOutPos = vInPos; // Pass through general texture coordinate. - nvsf_vInterpTexCoord = nvsf_vInTexCoord; + vInterpTexCoord = vInTexCoord; } #endif // !GFSDK_WAVEWORKS_OMIT_VS @@ -89,33 +89,33 @@ void vs( #ifndef GFSDK_WAVEWORKS_OMIT_PS #ifdef GFSDK_WAVEWORKS_GL -#define nvsf_Output gl_FragColor +#define Output gl_FragColor void main() #else void ps( - float2 nvsf_vInterpTexCoord SEMANTIC(TEXCOORD0), - out float4 nvsf_Output SEMANTIC(SV_Target) + float2 vInterpTexCoord SEMANTIC(TEXCOORD0), + out float4 Output SEMANTIC(SV_Target) ) #endif { - float2 nvsf_UVoffset = nvsf_g_UVOffsets.xy*nvsf_g_DissipationFactors.x; + float2 UVoffset = g_UVOffsets.xy*g_DissipationFactors.x; // blur with variable size kernel is done by doing 4 bilinear samples, // each sample is slightly offset from the center point - float nvsf_foamenergy1 = dot(nvsf_g_SourceComponents, SampleTex2D(nvsf_g_textureEnergyMap, nvsf_g_samplerEnergyMap, nvsf_vInterpTexCoord.xy + nvsf_UVoffset)); - float nvsf_foamenergy2 = dot(nvsf_g_SourceComponents, SampleTex2D(nvsf_g_textureEnergyMap, nvsf_g_samplerEnergyMap, nvsf_vInterpTexCoord.xy - nvsf_UVoffset)); - float nvsf_foamenergy3 = dot(nvsf_g_SourceComponents, SampleTex2D(nvsf_g_textureEnergyMap, nvsf_g_samplerEnergyMap, nvsf_vInterpTexCoord.xy + nvsf_UVoffset*2.0)); - float nvsf_foamenergy4 = dot(nvsf_g_SourceComponents, SampleTex2D(nvsf_g_textureEnergyMap, nvsf_g_samplerEnergyMap, nvsf_vInterpTexCoord.xy - nvsf_UVoffset*2.0)); + float foamenergy1 = dot(g_SourceComponents, SampleTex2D(g_textureEnergyMap, g_samplerEnergyMap, vInterpTexCoord.xy + UVoffset)); + float foamenergy2 = dot(g_SourceComponents, SampleTex2D(g_textureEnergyMap, g_samplerEnergyMap, vInterpTexCoord.xy - UVoffset)); + float foamenergy3 = dot(g_SourceComponents, SampleTex2D(g_textureEnergyMap, g_samplerEnergyMap, vInterpTexCoord.xy + UVoffset*2.0)); + float foamenergy4 = dot(g_SourceComponents, SampleTex2D(g_textureEnergyMap, g_samplerEnergyMap, vInterpTexCoord.xy - UVoffset*2.0)); - float nvsf_folding = max(0,SampleTex2D(nvsf_g_textureEnergyMap, nvsf_g_samplerEnergyMap, nvsf_vInterpTexCoord.xy).z); + float folding = max(0,SampleTex2D(g_textureEnergyMap, g_samplerEnergyMap, vInterpTexCoord.xy).z); - float nvsf_energy = nvsf_g_DissipationFactors.y*((nvsf_foamenergy1 + nvsf_foamenergy2 + nvsf_foamenergy3 + nvsf_foamenergy4)*0.25 + max(0,(1.0-nvsf_folding-nvsf_g_DissipationFactors.w))*nvsf_g_DissipationFactors.z); + float energy = g_DissipationFactors.y*((foamenergy1 + foamenergy2 + foamenergy3 + foamenergy4)*0.25 + max(0,(1.0-folding-g_DissipationFactors.w))*g_DissipationFactors.z); - nvsf_energy = min(1.0,nvsf_energy); + energy = min(1.0,energy); // Output - nvsf_Output = float4(nvsf_energy,nvsf_energy,nvsf_energy,nvsf_energy); + Output = float4(energy,energy,energy,energy); } #endif // !GFSDK_WAVEWORKS_OMIT_PS
\ No newline at end of file diff --git a/src/shader/FoamGeneration_glsl_ps.h b/src/shader/FoamGeneration_glsl_ps.h new file mode 100644 index 0000000..0ab5eed --- /dev/null +++ b/src/shader/FoamGeneration_glsl_ps.h @@ -0,0 +1,41 @@ +R"glsl( +//------------------------------------------------------------------------------------ +// Global variables +//------------------------------------------------------------------------------------ + +uniform vec4 g_DissipationFactors; +uniform vec4 g_SourceComponents; +uniform vec4 g_UVOffsets; + +uniform sampler2D g_samplerDisplacementMap; + +varying float2 vInterpTexCoord; + +// at 1st rendering step, the folding and the accumulated foam values are being read from gradient map (components z and w), +// blurred by X, summed, faded and written to foam energy map + +// at 2nd rendering step, the accumulated foam values are being read from foam energy texture, +// blurred by Y and written to w component of gradient map + +void main() +{ + + float2 UVoffset = g_UVOffsets.xy*g_DissipationFactors.x; + + // blur with variable size kernel is done by doing 4 bilinear samples, + // each sample is slightly offset from the center point + float foamenergy1 = dot(g_SourceComponents, texture(g_samplerEnergyMap, vInterpTexCoord.xy + UVoffset)); + float foamenergy2 = dot(g_SourceComponents, texture(g_samplerEnergyMap, vInterpTexCoord.xy - UVoffset)); + float foamenergy3 = dot(g_SourceComponents, texture(g_samplerEnergyMap, vInterpTexCoord.xy + UVoffset*2.0)); + float foamenergy4 = dot(g_SourceComponents, texture(g_samplerEnergyMap, vInterpTexCoord.xy - UVoffset*2.0)); + + float folding = max(0,texture(g_samplerEnergyMap, vInterpTexCoord.xy).z); + + float energy = g_DissipationFactors.y*((foamenergy1 + foamenergy2 + foamenergy3 + foamenergy4)*0.25 + max(0,(1.0-folding-g_DissipationFactors.w))*g_DissipationFactors.z); + + energy = min(1.0,energy); + + // Output + gl_FragColor = float4(energy,energy,energy,energy); +} +)glsl"; diff --git a/src/shader/FoamGeneration_glsl_vs.h b/src/shader/FoamGeneration_glsl_vs.h new file mode 100644 index 0000000..519efb2 --- /dev/null +++ b/src/shader/FoamGeneration_glsl_vs.h @@ -0,0 +1,25 @@ +R"glsl( +//------------------------------------------------------------------------------------ +// Global variables +//------------------------------------------------------------------------------------ + +uniform vec4 g_DissipationFactors; +uniform vec4 g_SourceComponents; +uniform vec4 g_UVOffsets; + +uniform sampler2D g_samplerDisplacementMap; + +varying float2 vInterpTexCoord; + +attribute float4 vInPos; +attribute float2 vInTexCoord; + +void main() +{ + // No need to do matrix transform. + gl_Position = vInPos; + + // Pass through general texture coordinate. + vInterpTexCoord = vInTexCoord; +} +)glsl";
\ No newline at end of file diff --git a/src/shader/Quadtree_SM4_sig.fx b/src/shader/Quadtree_SM4_sig.fx index f8d1a9d..c121356 100644 --- a/src/shader/Quadtree_SM4_sig.fx +++ b/src/shader/Quadtree_SM4_sig.fx @@ -35,5 +35,5 @@ float4 GFSDK_WAVEWORKS_VERTEX_INPUT_Sig(GFSDK_WAVEWORKS_VERTEX_INPUT In) : SV_Position { - return In.nvsf_vPos; + return In.vPos; } diff --git a/src/shader/Quadtree_SM5_sig.fx b/src/shader/Quadtree_SM5_sig.fx index c33887e..adefd2a 100644 --- a/src/shader/Quadtree_SM5_sig.fx +++ b/src/shader/Quadtree_SM5_sig.fx @@ -41,5 +41,5 @@ float4 GFSDK_WAVEWORKS_VERTEX_INPUT_Sig(GFSDK_WAVEWORKS_VERTEX_INPUT In) : SV_Position { - return In.nvsf_vPos; + return In.vPos; } |