From c120530bb807ba7fc97786c5ee71a603b997cc0a Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Sun, 12 Nov 2017 13:58:33 +0000 Subject: [PATCH] moved ocean simulator texture updates to compute shader --- Editor/CameraWindow.cpp | 2 +- Editor/Editor.cpp | 7 + Editor/OceanWindow.cpp | 3 + WickedEngine/WickedEngine_SHADERS.vcxproj | 12 +- .../WickedEngine_SHADERS.vcxproj.filters | 12 +- WickedEngine/oceanGradientFoldingPS.hlsl | 33 ---- WickedEngine/oceanQuadVS.hlsl | 11 +- WickedEngine/oceanSurfaceHF.hlsli | 17 +- .../oceanUpdateDisplacementMapCS.hlsl | 19 ++ WickedEngine/oceanUpdateDisplacementPS.hlsl | 18 -- .../oceanUpdateGradientFoldingCS.hlsl | 38 ++++ WickedEngine/oceanWaveGenHF.hlsli | 10 +- WickedEngine/wiGraphicsDevice_DX11.cpp | 2 +- WickedEngine/wiOcean.cpp | 163 +++--------------- WickedEngine/wiOcean.h | 11 +- 15 files changed, 120 insertions(+), 238 deletions(-) delete mode 100644 WickedEngine/oceanGradientFoldingPS.hlsl create mode 100644 WickedEngine/oceanUpdateDisplacementMapCS.hlsl delete mode 100644 WickedEngine/oceanUpdateDisplacementPS.hlsl create mode 100644 WickedEngine/oceanUpdateGradientFoldingCS.hlsl diff --git a/Editor/CameraWindow.cpp b/Editor/CameraWindow.cpp index a064ddfba..0d2cdd479 100644 --- a/Editor/CameraWindow.cpp +++ b/Editor/CameraWindow.cpp @@ -73,7 +73,7 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) - cameraWindow->Translate(XMFLOAT3(760, 500, 0)); + cameraWindow->Translate(XMFLOAT3(800, 500, 0)); cameraWindow->SetVisible(false); } diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 4d7f97189..cb9761c4e 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -1402,6 +1402,13 @@ void EditorComponent::Compose() { renderPath->Compose(); + if (wiRenderer::GetOcean()) + { + wiImageEffects fx(500, 500, 500, 500); + fx.blendFlag = BLENDMODE_OPAQUE; + wiImage::Draw(wiRenderer::GetOcean()->getDisplacementMap(), fx, GRAPHICSTHREAD_IMMEDIATE); + } + //__super::Compose(); for (auto& x : wiRenderer::GetScene().models) diff --git a/Editor/OceanWindow.cpp b/Editor/OceanWindow.cpp index 4e8a484c3..4b9198f31 100644 --- a/Editor/OceanWindow.cpp +++ b/Editor/OceanWindow.cpp @@ -9,6 +9,9 @@ OceanWindow::OceanWindow(wiGUI* gui) :GUI(gui) float screenW = (float)wiRenderer::GetDevice()->GetScreenWidth(); float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); + //params.patch_length = 200.0f; + //params.wave_amplitude = 0.0f; + oceanWindow = new wiWindow(GUI, "Ocean Window"); oceanWindow->SetSize(XMFLOAT2(600, 300)); GUI->AddWidget(oceanWindow); diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj index 4b923b7f6..1e26b10ad 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj @@ -452,9 +452,6 @@ Vertex - - Pixel - Vertex @@ -471,8 +468,13 @@ Vertex - - Pixel + + Compute + 5.0 + + + Compute + 5.0 Pixel diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters index 09bebcd73..1ba51d6d4 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters @@ -666,12 +666,6 @@ VS - - PS - - - PS - VS @@ -681,6 +675,12 @@ PS + + CS + + + CS + diff --git a/WickedEngine/oceanGradientFoldingPS.hlsl b/WickedEngine/oceanGradientFoldingPS.hlsl deleted file mode 100644 index 59ecdc3fc..000000000 --- a/WickedEngine/oceanGradientFoldingPS.hlsl +++ /dev/null @@ -1,33 +0,0 @@ -#include "oceanWaveGenHF.hlsli" - -// Displacement -> Normal, Folding -float4 main(VS_QUAD_OUTPUT In) : SV_Target -{ - // Sample neighbour texels - float2 one_texel = float2(1.0f / (float)g_OutWidth, 1.0f / (float)g_OutHeight); - - float2 tc_left = float2(In.TexCoord.x - one_texel.x, In.TexCoord.y); - float2 tc_right = float2(In.TexCoord.x + one_texel.x, In.TexCoord.y); - float2 tc_back = float2(In.TexCoord.x, In.TexCoord.y - one_texel.y); - float2 tc_front = float2(In.TexCoord.x, In.TexCoord.y + one_texel.y); - - float3 displace_left = g_samplerDisplacementMap.Sample(LinearSampler, tc_left).xyz; - float3 displace_right = g_samplerDisplacementMap.Sample(LinearSampler, tc_right).xyz; - float3 displace_back = g_samplerDisplacementMap.Sample(LinearSampler, tc_back).xyz; - float3 displace_front = g_samplerDisplacementMap.Sample(LinearSampler, tc_front).xyz; - - // Do not store the actual normal value. Using gradient instead, which preserves two differential values. - float2 gradient = { -(displace_right.z - displace_left.z), -(displace_front.z - displace_back.z) }; - - - // Calculate Jacobian corelation from the partial differential of height field - float2 Dx = (displace_right.xy - displace_left.xy) * g_ChoppyScale * g_GridLen; - float2 Dy = (displace_front.xy - displace_back.xy) * g_ChoppyScale * g_GridLen; - float J = (1.0f + Dx.x) * (1.0f + Dy.y) - Dx.y * Dy.x; - - // Practical subsurface scale calculation: max[0, (1 - J) + Amplitude * (2 * Coverage - 1)]. - float fold = max(1.0f - J, 0); - - // Output - return float4(gradient, 0, fold); -} diff --git a/WickedEngine/oceanQuadVS.hlsl b/WickedEngine/oceanQuadVS.hlsl index da1c5caea..f71494cf4 100644 --- a/WickedEngine/oceanQuadVS.hlsl +++ b/WickedEngine/oceanQuadVS.hlsl @@ -1,12 +1,11 @@ #include "oceanWaveGenHF.hlsli" +#include "fullScreenTriangleHF.hlsli" -VS_QUAD_OUTPUT main(float4 vPos : POSITION) +VS_QUAD_OUTPUT main(uint vI : SV_VertexID) { - VS_QUAD_OUTPUT Output; + VS_QUAD_OUTPUT Out; - Output.Position = vPos; - Output.TexCoord.x = 0.5f + vPos.x * 0.5f; - Output.TexCoord.y = 0.5f - vPos.y * 0.5f; + FullScreenTriangle(vI, Out.Position, Out.TexCoord); - return Output; + return Out; } diff --git a/WickedEngine/oceanSurfaceHF.hlsli b/WickedEngine/oceanSurfaceHF.hlsli index 7106f1364..0cf75ae09 100644 --- a/WickedEngine/oceanSurfaceHF.hlsli +++ b/WickedEngine/oceanSurfaceHF.hlsli @@ -1,30 +1,19 @@ #ifndef _OCEAN_SURFACE_HF_ #define _OCEAN_SURFACE_HF_ +#include "globals.hlsli" #include "ShaderInterop_Ocean.h" -//----------------------------------------------------------------------------- -// Global variables -//----------------------------------------------------------------------------- -#define PATCH_BLEND_BEGIN 800 -#define PATCH_BLEND_END 20000 +#define PATCH_BLEND_BEGIN 100 +#define PATCH_BLEND_END 2000 -//----------------------------------------------------------------------------------- -// Texture & Samplers -//----------------------------------------------------------------------------------- #define g_texDisplacement texture_0 // FFT wave displacement map in VS #define g_texPerlin texture_1 // FFT wave gradient map in PS #define g_texGradient texture_2 // Perlin wave displacement & gradient map in both VS & PS TEXTURE1D(g_texFresnel, float4, TEXSLOT_ONDEMAND3); // Fresnel factor lookup table #define g_texReflectCube texture_env_global - -//----------------------------------------------------------------------------- -// Name: OceanSurfVS -// Type: Vertex shader -// Desc: Ocean shading vertex shader. Check SDK document for more details -//----------------------------------------------------------------------------- struct VS_OUTPUT { float4 Position : SV_POSITION; diff --git a/WickedEngine/oceanUpdateDisplacementMapCS.hlsl b/WickedEngine/oceanUpdateDisplacementMapCS.hlsl new file mode 100644 index 000000000..e15ef7506 --- /dev/null +++ b/WickedEngine/oceanUpdateDisplacementMapCS.hlsl @@ -0,0 +1,19 @@ +#include "oceanWaveGenHF.hlsli" + +STRUCTUREDBUFFER(g_InputDxyz, float2, TEXSLOT_ONDEMAND0); +RWTEXTURE2D(output, float4, 0); + +[numthreads(32, 32, 1)] +void main(uint3 DTid : SV_DispatchThreadID) +{ + uint addr = g_OutWidth * DTid.y + DTid.x; + + // cos(pi * (m1 + m2)) + int sign_correction = ((DTid.x + DTid.y) & 1) ? -1 : 1; + + float dx = g_InputDxyz[addr + g_DtxAddressOffset].x * sign_correction * g_ChoppyScale; + float dy = g_InputDxyz[addr + g_DtyAddressOffset].x * sign_correction * g_ChoppyScale; + float dz = g_InputDxyz[addr].x * sign_correction; + + output[DTid.xy] = float4(dx, dy, dz, 1); +} diff --git a/WickedEngine/oceanUpdateDisplacementPS.hlsl b/WickedEngine/oceanUpdateDisplacementPS.hlsl deleted file mode 100644 index 4d0d455b4..000000000 --- a/WickedEngine/oceanUpdateDisplacementPS.hlsl +++ /dev/null @@ -1,18 +0,0 @@ -#include "oceanWaveGenHF.hlsli" - -// Post-FFT data wrap up: Dx, Dy, Dz -> Displacement -float4 main(VS_QUAD_OUTPUT In) : SV_Target -{ - uint index_x = (uint)(In.TexCoord.x * (float)g_OutWidth); - uint index_y = (uint)(In.TexCoord.y * (float)g_OutHeight); - uint addr = g_OutWidth * index_y + index_x; - - // cos(pi * (m1 + m2)) - int sign_correction = ((index_x + index_y) & 1) ? -1 : 1; - - float dx = g_InputDxyz[addr + g_DtxAddressOffset].x * sign_correction * g_ChoppyScale; - float dy = g_InputDxyz[addr + g_DtyAddressOffset].x * sign_correction * g_ChoppyScale; - float dz = g_InputDxyz[addr].x * sign_correction; - - return float4(dx, dy, dz, 1); -} diff --git a/WickedEngine/oceanUpdateGradientFoldingCS.hlsl b/WickedEngine/oceanUpdateGradientFoldingCS.hlsl new file mode 100644 index 000000000..27bea224b --- /dev/null +++ b/WickedEngine/oceanUpdateGradientFoldingCS.hlsl @@ -0,0 +1,38 @@ +#include "oceanWaveGenHF.hlsli" + +#define xDisplacementMap texture_0 +RWTEXTURE2D(output, float4, 0); + +[numthreads(32, 32, 1)] +void main( uint3 DTid : SV_DispatchThreadID ) +{ + // Sample neighbour texels + float2 one_texel = float2(1.0f / (float)g_OutWidth, 1.0f / (float)g_OutHeight); + + float2 uv = (float2)DTid.xy / float2(g_OutWidth, g_OutHeight); + + float2 tc_left = float2(uv.x - one_texel.x, uv.y); + float2 tc_right = float2(uv.x + one_texel.x, uv.y); + float2 tc_back = float2(uv.x, uv.y - one_texel.y); + float2 tc_front = float2(uv.x, uv.y + one_texel.y); + + float3 displace_left = xDisplacementMap.SampleLevel(sampler_linear_clamp, tc_left, 0).xyz; + float3 displace_right = xDisplacementMap.SampleLevel(sampler_linear_clamp, tc_right, 0).xyz; + float3 displace_back = xDisplacementMap.SampleLevel(sampler_linear_clamp, tc_back, 0).xyz; + float3 displace_front = xDisplacementMap.SampleLevel(sampler_linear_clamp, tc_front, 0).xyz; + + // Do not store the actual normal value. Using gradient instead, which preserves two differential values. + float2 gradient = { -(displace_right.z - displace_left.z), -(displace_front.z - displace_back.z) }; + + + // Calculate Jacobian corelation from the partial differential of height field + float2 Dx = (displace_right.xy - displace_left.xy) * g_ChoppyScale * g_GridLen; + float2 Dy = (displace_front.xy - displace_back.xy) * g_ChoppyScale * g_GridLen; + float J = (1.0f + Dx.x) * (1.0f + Dy.y) - Dx.y * Dy.x; + + // Practical subsurface scale calculation: max[0, (1 - J) + Amplitude * (2 * Coverage - 1)]. + float fold = max(1.0f - J, 0); + + // Output + output[DTid.xy] = float4(gradient, 0, fold); +} \ No newline at end of file diff --git a/WickedEngine/oceanWaveGenHF.hlsli b/WickedEngine/oceanWaveGenHF.hlsli index 2298cb598..f6f6825f0 100644 --- a/WickedEngine/oceanWaveGenHF.hlsli +++ b/WickedEngine/oceanWaveGenHF.hlsli @@ -12,12 +12,10 @@ struct VS_QUAD_OUTPUT //----------------------------------------- Pixel Shaders ------------------------------------------ -// Textures and sampling states -#define g_samplerDisplacementMap texture_0 +//// Textures and sampling states +//#define g_samplerDisplacementMap texture_0 +// +//SAMPLERSTATE(LinearSampler, SSLOT_ONDEMAND0); -SAMPLERSTATE(LinearSampler, SSLOT_ONDEMAND0); - -// The following three should contains only real numbers. But we have only C2C FFT now. -STRUCTUREDBUFFER(g_InputDxyz, float2, TEXSLOT_ONDEMAND0); #endif // _OCEAN_SIMULATOR_HF_ diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 110a7842d..961185cb9 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -1405,7 +1405,7 @@ GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type windo } UINT createDeviceFlags = 0; - //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; D3D_DRIVER_TYPE driverTypes[] = { diff --git a/WickedEngine/wiOcean.cpp b/WickedEngine/wiOcean.cpp index f4202d5d9..b532554cb 100644 --- a/WickedEngine/wiOcean.cpp +++ b/WickedEngine/wiOcean.cpp @@ -7,13 +7,11 @@ using namespace wiGraphicsTypes; using namespace std; ComputeShader* wiOcean::m_pUpdateSpectrumCS = nullptr; -VertexShader* wiOcean::m_pQuadVS = nullptr; -PixelShader* wiOcean::m_pUpdateDisplacementPS = nullptr; -PixelShader* wiOcean::m_pGenGradientFoldingPS = nullptr; +ComputeShader* wiOcean::m_pUpdateDisplacementMapCS = nullptr; +ComputeShader* wiOcean::m_pUpdateGradientFoldingCS = nullptr; VertexShader* wiOcean::g_pOceanSurfVS = nullptr; PixelShader* wiOcean::g_pWireframePS = nullptr; PixelShader* wiOcean::g_pOceanSurfPS = nullptr; -VertexLayout* wiOcean::m_pQuadLayout = nullptr; VertexLayout* wiOcean::g_pMeshLayout = nullptr; // Disable warning "conditional expression is constant" @@ -112,7 +110,7 @@ void createTextureAndViews(UINT width, UINT height, FORMAT format, Texture2D** p tex_desc.SampleDesc.Count = 1; tex_desc.SampleDesc.Quality = 0; tex_desc.Usage = USAGE_DEFAULT; - tex_desc.BindFlags = BIND_SHADER_RESOURCE | BIND_RENDER_TARGET; + tex_desc.BindFlags = BIND_SHADER_RESOURCE | BIND_UNORDERED_ACCESS | BIND_RENDER_TARGET; tex_desc.CPUAccessFlags = 0; tex_desc.MiscFlags = RESOURCE_MISC_GENERATE_MIPS; @@ -197,46 +195,6 @@ wiOcean::wiOcean(const wiOceanParameter& params) createTextureAndViews(hmap_dim, hmap_dim, FORMAT_R32G32B32A32_FLOAT, &m_pDisplacementMap); createTextureAndViews(hmap_dim, hmap_dim, FORMAT_R16G16B16A16_FLOAT, &m_pGradientMap); - // Samplers - SamplerDesc sam_desc; - sam_desc.Filter = FILTER_MIN_MAG_LINEAR_MIP_POINT; - sam_desc.AddressU = TEXTURE_ADDRESS_WRAP; - sam_desc.AddressV = TEXTURE_ADDRESS_WRAP; - sam_desc.AddressW = TEXTURE_ADDRESS_WRAP; - sam_desc.MipLODBias = 0; - sam_desc.MaxAnisotropy = 1; - sam_desc.ComparisonFunc = COMPARISON_NEVER; - sam_desc.BorderColor[0] = 1.0f; - sam_desc.BorderColor[1] = 1.0f; - sam_desc.BorderColor[2] = 1.0f; - sam_desc.BorderColor[3] = 1.0f; - sam_desc.MinLOD = -FLT_MAX; - sam_desc.MaxLOD = FLT_MAX; - wiRenderer::GetDevice()->CreateSamplerState(&sam_desc, &m_pPointSamplerState); - - - // Quad vertex buffer - GPUBufferDesc vb_desc; - vb_desc.ByteWidth = 4 * sizeof(XMFLOAT4); - vb_desc.Usage = USAGE_IMMUTABLE; - vb_desc.BindFlags = BIND_VERTEX_BUFFER; - vb_desc.CPUAccessFlags = 0; - vb_desc.MiscFlags = 0; - - float quad_verts[] = - { - -1, -1, 0, 1, - -1, 1, 0, 1, - 1, -1, 0, 1, - 1, 1, 0, 1, - }; - SubresourceData init_data; - init_data.pSysMem = &quad_verts[0]; - init_data.SysMemPitch = 0; - init_data.SysMemSlicePitch = 0; - - m_pQuadVB = new GPUBuffer; - wiRenderer::GetDevice()->CreateBuffer(&vb_desc, &init_data, m_pQuadVB); // Constant buffers UINT actual_dim = m_param.dmap_dim; @@ -282,8 +240,6 @@ wiOcean::~wiOcean() SAFE_DELETE(m_pBuffer_Float2_Ht); SAFE_DELETE(m_pBuffer_Float_Dxyz); - SAFE_DELETE(m_pQuadVB); - SAFE_DELETE(m_pDisplacementMap); SAFE_DELETE(m_pGradientMap); @@ -356,7 +312,6 @@ void wiOcean::UpdateDisplacementMap(float time, GRAPHICSTHREAD threadID) device->EventBegin("OceanSimulator", threadID); // ---------------------------- H(0) -> H(t), D(x, t), D(y, t) -------------------------------- - // Compute shader device->BindCS(m_pUpdateSpectrumCS, threadID); // Buffers @@ -383,13 +338,6 @@ void wiOcean::UpdateDisplacementMap(float time, GRAPHICSTHREAD threadID) UINT group_count_y = (m_param.dmap_dim + BLOCK_SIZE_Y - 1) / BLOCK_SIZE_Y; device->Dispatch(group_count_x, group_count_y, 1, threadID); - //// Unbind resources for CS - //cs0_uavs[0] = NULL; - //m_pd3dImmediateContext->CSSetUnorderedAccessViews(0, 1, cs0_uavs, (UINT*)(&cs0_uavs[0])); - //cs0_srvs[0] = NULL; - //cs0_srvs[1] = NULL; - //m_pd3dImmediateContext->CSSetShaderResources(0, 2, cs0_srvs); - device->UnBindUnorderedAccessResources(0, 1, threadID); device->UnBindResources(TEXSLOT_ONDEMAND0, 2, threadID); @@ -397,80 +345,34 @@ void wiOcean::UpdateDisplacementMap(float time, GRAPHICSTHREAD threadID) // ------------------------------------ Perform FFT ------------------------------------------- fft_512x512_c2c(&m_fft_plan, m_pBuffer_Float_Dxyz, m_pBuffer_Float_Dxyz, m_pBuffer_Float2_Ht, threadID); - // --------------------------------- Wrap Dx, Dy and Dz --------------------------------------- - // Push RT - //ID3D11RenderTargetView* old_target; - //ID3D11DepthStencilView* old_depth; - //m_pd3dImmediateContext->OMGetRenderTargets(1, &old_target, &old_depth); - //VIEWPORT old_viewport; - //UINT num_viewport = 1; - //m_pd3dImmediateContext->RSGetViewports(&num_viewport, &old_viewport); - ViewPort new_vp; - new_vp.TopLeftX = 0; - new_vp.TopLeftX = 0; - new_vp.Width = (float)m_param.dmap_dim; - new_vp.Height = (float)m_param.dmap_dim; - new_vp.MinDepth = 0.0f; - new_vp.MaxDepth = 1.0f; - device->BindViewports(1, &new_vp, threadID); - // Set RT - device->BindRenderTargets(1, (Texture**)&m_pDisplacementMap, nullptr, threadID); + device->BindConstantBufferCS(m_pImmutableCB, CB_GETBINDSLOT(Ocean_Simulation_ImmutableCB), threadID); + device->BindConstantBufferCS(m_pPerFrameCB, CB_GETBINDSLOT(Ocean_Simulation_PerFrameCB), threadID); - // VS & PS - device->BindVS(m_pQuadVS, threadID); - device->BindPS(m_pUpdateDisplacementPS, threadID); - device->BindConstantBufferPS(m_pImmutableCB, CB_GETBINDSLOT(Ocean_Simulation_ImmutableCB), threadID); - device->BindConstantBufferPS(m_pPerFrameCB, CB_GETBINDSLOT(Ocean_Simulation_PerFrameCB), threadID); + // Update displacement map: + device->BindCS(m_pUpdateDisplacementMapCS, threadID); + GPUUnorderedResource* cs_uavs[] = { m_pDisplacementMap }; + device->BindUnorderedAccessResourcesCS(cs_uavs, 0, 1, threadID); + GPUResource* cs_srvs[1] = { m_pBuffer_Float_Dxyz }; + device->BindResourcesCS(cs_srvs, TEXSLOT_ONDEMAND0, 1, threadID); + device->Dispatch(m_param.dmap_dim / 32, m_param.dmap_dim / 32, 1, threadID); - // Buffer resources - GPUResource* ps_srvs[1] = { m_pBuffer_Float_Dxyz }; - device->BindResourcesPS(ps_srvs, TEXSLOT_ONDEMAND0, 1, threadID); - // IA setup - GPUBuffer* vbs[1] = { m_pQuadVB }; - UINT strides[1] = { sizeof(XMFLOAT4) }; - UINT offsets[1] = { 0 }; - device->BindVertexBuffers(&vbs[0], 0, 1, &strides[0], &offsets[0], threadID); - - device->BindVertexLayout(m_pQuadLayout, threadID); - device->BindPrimitiveTopology(TRIANGLESTRIP, threadID); - - // Perform draw call - device->Draw(4, 0, threadID); + // Update gradient map: + device->BindCS(m_pUpdateGradientFoldingCS, threadID); + cs_uavs[0] = { m_pGradientMap }; + device->BindUnorderedAccessResourcesCS(cs_uavs, 0, 1, threadID); + cs_srvs[0] = m_pDisplacementMap; + device->BindResourcesCS(cs_srvs, TEXSLOT_ONDEMAND0, 1, threadID); + device->Dispatch(m_param.dmap_dim / 32, m_param.dmap_dim / 32, 1, threadID); // Unbind + device->UnBindUnorderedAccessResources(0, 1, threadID); device->UnBindResources(TEXSLOT_ONDEMAND0, 1, threadID); - // ----------------------------------- Generate Normal ---------------------------------------- - // Set RT - device->BindRenderTargets(1, (Texture**)&m_pGradientMap, nullptr, threadID); - - // VS & PS - device->BindVS(m_pQuadVS, threadID); - device->BindPS(m_pGenGradientFoldingPS, threadID); - - // Texture resource and sampler - ps_srvs[0] = m_pDisplacementMap; - device->BindResourcesPS(ps_srvs, TEXSLOT_ONDEMAND0, 1, threadID); - - device->BindSamplerPS(&m_pPointSamplerState, SSLOT_ONDEMAND0, threadID); - - // Perform draw call - device->Draw(4, 0, threadID); - - // Unbind - device->UnBindResources(TEXSLOT_ONDEMAND0, 1, threadID); - - //// Pop RT - //m_pd3dImmediateContext->RSSetViewports(1, &old_viewport); - //m_pd3dImmediateContext->OMSetRenderTargets(1, &old_target, old_depth); - //SAFE_DELETE(old_target); - //SAFE_DELETE(old_depth); - device->GenerateMips(m_pGradientMap, threadID); @@ -1403,22 +1305,8 @@ void wiOcean::LoadShaders() { m_pUpdateSpectrumCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSimulatorCS.cso", wiResourceManager::COMPUTESHADER)); - - { - VertexLayoutDesc layout[] = - { - { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, 0, INPUT_PER_VERTEX_DATA, 0 }, - }; - UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanQuadVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); - if (vsinfo != nullptr) { - m_pQuadVS = vsinfo->vertexShader; - m_pQuadLayout = vsinfo->vertexLayout; - } - } - - m_pUpdateDisplacementPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanUpdateDisplacementPS.cso", wiResourceManager::PIXELSHADER)); - m_pGenGradientFoldingPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanGradientFoldingPS.cso", wiResourceManager::PIXELSHADER)); + m_pUpdateDisplacementMapCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanUpdateDisplacementMapCS.cso", wiResourceManager::COMPUTESHADER)); + m_pUpdateGradientFoldingCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanUpdateGradientFoldingCS.cso", wiResourceManager::COMPUTESHADER)); { @@ -1448,11 +1336,8 @@ void wiOcean::SetUpStatic() void wiOcean::CleanUpStatic() { SAFE_DELETE(m_pUpdateSpectrumCS); - SAFE_DELETE(m_pQuadVS); - SAFE_DELETE(m_pUpdateDisplacementPS); - SAFE_DELETE(m_pGenGradientFoldingPS); - - SAFE_DELETE(m_pQuadLayout); + SAFE_DELETE(m_pUpdateDisplacementMapCS); + SAFE_DELETE(m_pUpdateGradientFoldingCS); SAFE_DELETE(g_pMeshLayout); diff --git a/WickedEngine/wiOcean.h b/WickedEngine/wiOcean.h index d04a94208..23bcc0b87 100644 --- a/WickedEngine/wiOcean.h +++ b/WickedEngine/wiOcean.h @@ -93,21 +93,14 @@ protected: // Height & choppy buffer in the space domain, corresponding to H(t), Dx(t) and Dy(t) wiGraphicsTypes::GPUBuffer* m_pBuffer_Float_Dxyz; - wiGraphicsTypes::GPUBuffer* m_pQuadVB; - // Shaders, layouts and constants static wiGraphicsTypes::ComputeShader* m_pUpdateSpectrumCS; - static wiGraphicsTypes::VertexShader* m_pQuadVS; - static wiGraphicsTypes::PixelShader* m_pUpdateDisplacementPS; - static wiGraphicsTypes::PixelShader* m_pGenGradientFoldingPS; - - static wiGraphicsTypes::VertexLayout* m_pQuadLayout; + static wiGraphicsTypes::ComputeShader* m_pUpdateDisplacementMapCS; + static wiGraphicsTypes::ComputeShader* m_pUpdateGradientFoldingCS; wiGraphicsTypes::GPUBuffer* m_pImmutableCB; wiGraphicsTypes::GPUBuffer* m_pPerFrameCB; - wiGraphicsTypes::Sampler m_pPointSamplerState; - // FFT wrap-up CSFFT512x512_Plan m_fft_plan;