From 78d8583a87602fc7d44489be19e511ef903d3961 Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Sun, 12 Nov 2017 15:27:17 +0000 Subject: [PATCH] ocean updates --- Editor/Editor.cpp | 12 +- Editor/OceanWindow.cpp | 4 +- WickedEngine/wiGraphicsDevice_DX11.cpp | 2 +- WickedEngine/wiOcean.cpp | 330 ++++++++++++------------- WickedEngine/wiOcean.h | 34 ++- WickedEngine/wiRenderer.cpp | 2 + 6 files changed, 194 insertions(+), 190 deletions(-) diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index cb9761c4e..67b2b30f0 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -1402,12 +1402,12 @@ 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); - } + //if (wiRenderer::GetOcean()) + //{ + // wiImageEffects fx(500, 500, 500, 500); + // fx.blendFlag = BLENDMODE_OPAQUE; + // wiImage::Draw(wiRenderer::GetOcean()->getDisplacementMap(), fx, GRAPHICSTHREAD_IMMEDIATE); + //} //__super::Compose(); diff --git a/Editor/OceanWindow.cpp b/Editor/OceanWindow.cpp index 4b9198f31..ba0e03a9c 100644 --- a/Editor/OceanWindow.cpp +++ b/Editor/OceanWindow.cpp @@ -9,8 +9,6 @@ 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)); @@ -39,7 +37,7 @@ OceanWindow::OceanWindow(wiGUI* gui) :GUI(gui) }); oceanWindow->AddWidget(patchSizeSlider); - waveAmplitudeSlider = new wiSlider(0, 10, 1000, 100000, "Wave amplitude: "); + waveAmplitudeSlider = new wiSlider(0, 100, 1000, 100000, "Wave amplitude: "); waveAmplitudeSlider->SetSize(XMFLOAT2(100, 30)); waveAmplitudeSlider->SetPos(XMFLOAT2(x, y += inc)); waveAmplitudeSlider->SetValue(params.wave_amplitude); diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 961185cb9..110a7842d 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 1214c7ab8..5a436668d 100644 --- a/WickedEngine/wiOcean.cpp +++ b/WickedEngine/wiOcean.cpp @@ -12,7 +12,18 @@ ComputeShader* wiOcean::m_pUpdateGradientFoldingCS = nullptr; VertexShader* wiOcean::g_pOceanSurfVS = nullptr; PixelShader* wiOcean::g_pWireframePS = nullptr; PixelShader* wiOcean::g_pOceanSurfPS = nullptr; + VertexLayout* wiOcean::g_pMeshLayout = nullptr; +Texture1D* wiOcean::g_pFresnelMap = nullptr; +Texture2D* wiOcean::g_pPerlinMap = nullptr; +GPUBuffer* wiOcean::g_pPerCallCB = nullptr; +GPUBuffer* wiOcean::g_pShadingCB = nullptr; +RasterizerState* wiOcean::g_pRSState_Solid = nullptr; +RasterizerState* wiOcean::g_pRSState_Wireframe = nullptr; +DepthStencilState* wiOcean::g_pDSState_Disable = nullptr; +BlendState* wiOcean::g_pBState_Transparent = nullptr; + +CSFFT512x512_Plan wiOcean::m_fft_plan; // Disable warning "conditional expression is constant" #pragma warning(disable:4127) @@ -148,13 +159,14 @@ void createTextureAndViews(UINT width, UINT height, FORMAT format, Texture2D** p wiOcean::wiOcean(const wiOceanParameter& params) { + m_param = params; + // Height map H(0) int height_map_size = (params.dmap_dim + 4) * (params.dmap_dim + 1); XMFLOAT2* h0_data = new XMFLOAT2[height_map_size * sizeof(XMFLOAT2)]; float* omega_data = new float[height_map_size * sizeof(float)]; initHeightMap(h0_data, omega_data); - m_param = params; int hmap_dim = params.dmap_dim; int input_full_size = (hmap_dim + 4) * (hmap_dim + 1); // This value should be (hmap_dim / 2 + 1) * hmap_dim, but we use full sized buffer here for simplicity. @@ -188,7 +200,7 @@ wiOcean::wiOcean(const wiOceanParameter& params) SAFE_DELETE_ARRAY(h0_data); SAFE_DELETE_ARRAY(omega_data); - // D3D11 Textures + createTextureAndViews(hmap_dim, hmap_dim, FORMAT_R32G32B32A32_FLOAT, &m_pDisplacementMap); createTextureAndViews(hmap_dim, hmap_dim, FORMAT_R16G16B16A16_FLOAT, &m_pGradientMap); @@ -222,15 +234,12 @@ wiOcean::wiOcean(const wiOceanParameter& params) m_pPerFrameCB = new GPUBuffer; wiRenderer::GetDevice()->CreateBuffer(&cb_desc, nullptr, m_pPerFrameCB); - // FFT - fft512x512_create_plan(&m_fft_plan, 3); initRenderResource(); } wiOcean::~wiOcean() { - fft512x512_destroy_plan(&m_fft_plan); SAFE_DELETE(m_pBuffer_Float2_H0); SAFE_DELETE(m_pBuffer_Float_Omega); @@ -368,6 +377,7 @@ void wiOcean::UpdateDisplacementMap(float time, GRAPHICSTHREAD threadID) // Unbind device->UnBindUnorderedAccessResources(0, 1, threadID); device->UnBindResources(TEXSLOT_ONDEMAND0, 1, threadID); + device->BindCS(nullptr, threadID); device->GenerateMips(m_pGradientMap, threadID); @@ -406,100 +416,7 @@ void wiOcean::initRenderResource() g_WindDir = m_param.wind_dir; - // D3D buffers createSurfaceMesh(); - createFresnelMap(); - loadTextures(); - - - // Constants - GPUBufferDesc cb_desc; - cb_desc.Usage = USAGE_DYNAMIC; - cb_desc.BindFlags = BIND_CONSTANT_BUFFER; - cb_desc.CPUAccessFlags = CPU_ACCESS_WRITE; - cb_desc.MiscFlags = 0; - cb_desc.ByteWidth = sizeof(Ocean_Rendering_PatchCB); - cb_desc.StructureByteStride = 0; - g_pPerCallCB = new GPUBuffer; - device->CreateBuffer(&cb_desc, nullptr, g_pPerCallCB); - - Ocean_Rendering_ShadingCB shading_data; - // Grid side length * 2 - shading_data.g_TexelLength_x2 = m_param.patch_length / m_param.dmap_dim * 2;; - // Color - shading_data.g_SkyColor = g_SkyColor; - shading_data.g_WaterbodyColor = g_WaterbodyColor; - // Texcoord - shading_data.g_UVScale = 1.0f / m_param.patch_length; - shading_data.g_UVOffset = 0.5f / m_param.dmap_dim; - // Perlin - shading_data.g_PerlinSize = g_PerlinSize; - shading_data.g_PerlinAmplitude = g_PerlinAmplitude; - shading_data.g_PerlinGradient = g_PerlinGradient; - shading_data.g_PerlinOctave = g_PerlinOctave; - // Multiple reflection workaround - shading_data.g_BendParam = g_BendParam; - // Sun streaks - shading_data.g_SunColor = g_SunColor; - shading_data.g_SunDir = g_SunDir; - shading_data.g_Shineness = g_Shineness; - - SubresourceData cb_init_data; - cb_init_data.pSysMem = &shading_data; - cb_init_data.SysMemPitch = 0; - cb_init_data.SysMemSlicePitch = 0; - - cb_desc.Usage = USAGE_IMMUTABLE; - cb_desc.CPUAccessFlags = 0; - cb_desc.ByteWidth = sizeof(Ocean_Rendering_ShadingCB); - cb_desc.StructureByteStride = 0; - g_pShadingCB = new GPUBuffer; - device->CreateBuffer(&cb_desc, &cb_init_data, g_pShadingCB); - - // State blocks - RasterizerStateDesc ras_desc; - ras_desc.FillMode = FILL_SOLID; - ras_desc.CullMode = CULL_NONE; - ras_desc.FrontCounterClockwise = false; - ras_desc.DepthBias = 0; - ras_desc.SlopeScaledDepthBias = 0.0f; - ras_desc.DepthBiasClamp = 0.0f; - ras_desc.DepthClipEnable = true; - ras_desc.ScissorEnable = false; - ras_desc.MultisampleEnable = true; - ras_desc.AntialiasedLineEnable = false; - - g_pRSState_Solid = new RasterizerState; - device->CreateRasterizerState(&ras_desc, g_pRSState_Solid); - - ras_desc.FillMode = FILL_WIREFRAME; - - g_pRSState_Wireframe = new RasterizerState; - device->CreateRasterizerState(&ras_desc, g_pRSState_Wireframe); - - DepthStencilStateDesc depth_desc; - memset(&depth_desc, 0, sizeof(DepthStencilStateDesc)); - depth_desc.DepthEnable = true; - depth_desc.DepthWriteMask = DEPTH_WRITE_MASK_ALL; - depth_desc.DepthFunc = COMPARISON_GREATER; - depth_desc.StencilEnable = false; - g_pDSState_Disable = new DepthStencilState; - device->CreateDepthStencilState(&depth_desc, g_pDSState_Disable); - - BlendStateDesc blend_desc; - memset(&blend_desc, 0, sizeof(BlendStateDesc)); - blend_desc.AlphaToCoverageEnable = false; - blend_desc.IndependentBlendEnable = false; - blend_desc.RenderTarget[0].BlendEnable = true; - blend_desc.RenderTarget[0].SrcBlend = BLEND_SRC_ALPHA; - blend_desc.RenderTarget[0].DestBlend = BLEND_INV_SRC_ALPHA; - blend_desc.RenderTarget[0].BlendOp = BLEND_OP_ADD; - blend_desc.RenderTarget[0].SrcBlendAlpha = BLEND_ONE; - blend_desc.RenderTarget[0].DestBlendAlpha = BLEND_ZERO; - blend_desc.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD; - blend_desc.RenderTarget[0].RenderTargetWriteMask = COLOR_WRITE_ENABLE_ALL; - g_pBState_Transparent = new BlendState; - device->CreateBlendState(&blend_desc, g_pBState_Transparent); } void wiOcean::cleanupRenderResource() @@ -507,18 +424,6 @@ void wiOcean::cleanupRenderResource() SAFE_DELETE(g_pMeshIB); SAFE_DELETE(g_pMeshVB); - SAFE_DELETE(g_pFresnelMap); - SAFE_DELETE(g_pPerlinMap); - - SAFE_DELETE(g_pPerCallCB); - SAFE_DELETE(g_pPerFrameCB); - SAFE_DELETE(g_pShadingCB); - - SAFE_DELETE(g_pRSState_Solid); - SAFE_DELETE(g_pRSState_Wireframe); - SAFE_DELETE(g_pDSState_Disable); - SAFE_DELETE(g_pBState_Transparent); - g_render_list.clear(); } @@ -842,51 +747,6 @@ void wiOcean::createSurfaceMesh() SAFE_DELETE_ARRAY(index_array); } -void wiOcean::createFresnelMap() -{ - static const int FRESNEL_TEX_SIZE = 256; - static const float g_SkyBlending = 16.0f; - - uint32_t* buffer = new uint32_t[FRESNEL_TEX_SIZE]; - for (int i = 0; i < FRESNEL_TEX_SIZE; i++) - { - float cos_a = i / (FLOAT)FRESNEL_TEX_SIZE; - // Using water's refraction index 1.33 - uint32_t fresnel = (uint32_t)(XMVectorGetX(XMFresnelTerm(XMVectorSet(cos_a, cos_a, cos_a, cos_a), XMVectorSet(1.33f, 1.33f, 1.33f, 1.33f))) * 255); - - uint32_t sky_blend = (uint32_t)(powf(1 / (1 + cos_a), g_SkyBlending) * 255); - - buffer[i] = (sky_blend << 8) | fresnel; - } - - - - Texture1DDesc tex_desc; - tex_desc.Width = FRESNEL_TEX_SIZE; - tex_desc.MipLevels = 1; - tex_desc.ArraySize = 1; - tex_desc.Format = FORMAT_R8G8B8A8_UNORM; - tex_desc.Usage = USAGE_IMMUTABLE; - tex_desc.BindFlags = BIND_SHADER_RESOURCE; - tex_desc.CPUAccessFlags = 0; - tex_desc.MiscFlags = 0; - - SubresourceData init_data; - init_data.pSysMem = buffer; - init_data.SysMemPitch = 0; - init_data.SysMemSlicePitch = 0; - - HRESULT hr = wiRenderer::GetDevice()->CreateTexture1D(&tex_desc, &init_data, &g_pFresnelMap); - assert(SUCCEEDED(hr)); - - delete[] buffer; -} - -void wiOcean::loadTextures() -{ - wiRenderer::GetDevice()->CreateTextureFromFile("perlin_noise.dds", &g_pPerlinMap, true, GRAPHICSTHREAD_IMMEDIATE); -} - bool wiOcean::checkNodeVisibility(const QuadNode& quad_node, const Camera& camera) { // Plane equation setup @@ -1220,6 +1080,30 @@ void wiOcean::Render(const Camera* camera, float time, GRAPHICSTHREAD threadID) device->BindDepthStencilState(g_pDSState_Disable, 0, threadID); // Constants + + Ocean_Rendering_ShadingCB shading_data; + // Grid side length * 2 + shading_data.g_TexelLength_x2 = m_param.patch_length / m_param.dmap_dim * 2;; + // Color + shading_data.g_SkyColor = g_SkyColor; + shading_data.g_WaterbodyColor = g_WaterbodyColor; + // Texcoord + shading_data.g_UVScale = 1.0f / m_param.patch_length; + shading_data.g_UVOffset = 0.5f / m_param.dmap_dim; + // Perlin + shading_data.g_PerlinSize = g_PerlinSize; + shading_data.g_PerlinAmplitude = g_PerlinAmplitude; + shading_data.g_PerlinGradient = g_PerlinGradient; + shading_data.g_PerlinOctave = g_PerlinOctave; + // Multiple reflection workaround + shading_data.g_BendParam = g_BendParam; + // Sun streaks + shading_data.g_SunColor = g_SunColor; + shading_data.g_SunDir = g_SunDir; + shading_data.g_Shineness = g_Shineness; + + device->UpdateBuffer(g_pShadingCB, &shading_data, threadID); + device->BindConstantBufferVS(g_pShadingCB, CB_GETBINDSLOT(Ocean_Rendering_ShadingCB), threadID); device->BindConstantBufferPS(g_pShadingCB, CB_GETBINDSLOT(Ocean_Rendering_ShadingCB), threadID); @@ -1284,17 +1168,6 @@ void wiOcean::Render(const Camera* camera, float time, GRAPHICSTHREAD threadID) device->DrawIndexed(render_param.num_boundary_faces * 3, render_param.boundary_start_index, 0, threadID); } } - - //// Unbind - //vs_srvs[0] = NULL; - //vs_srvs[1] = NULL; - //pd3dContext->VSSetShaderResources(0, 2, &vs_srvs[0]); - - //ps_srvs[0] = NULL; - //ps_srvs[1] = NULL; - //ps_srvs[2] = NULL; - //ps_srvs[3] = NULL; - //pd3dContext->PSSetShaderResources(1, 4, &ps_srvs[0]); } @@ -1328,17 +1201,138 @@ void wiOcean::SetUpStatic() { LoadShaders(); CSFFT_512x512_Data_t::LoadShaders(); + fft512x512_create_plan(&m_fft_plan, 3); + + GraphicsDevice* device = wiRenderer::GetDevice(); + + static const int FRESNEL_TEX_SIZE = 256; + static const float g_SkyBlending = 16.0f; + + uint32_t* buffer = new uint32_t[FRESNEL_TEX_SIZE]; + for (int i = 0; i < FRESNEL_TEX_SIZE; i++) + { + float cos_a = i / (FLOAT)FRESNEL_TEX_SIZE; + // Using water's refraction index 1.33 + uint32_t fresnel = (uint32_t)(XMVectorGetX(XMFresnelTerm(XMVectorSet(cos_a, cos_a, cos_a, cos_a), XMVectorSet(1.33f, 1.33f, 1.33f, 1.33f))) * 255); + + uint32_t sky_blend = (uint32_t)(powf(1 / (1 + cos_a), g_SkyBlending) * 255); + + buffer[i] = (sky_blend << 8) | fresnel; + } + + + + Texture1DDesc tex_desc; + tex_desc.Width = FRESNEL_TEX_SIZE; + tex_desc.MipLevels = 1; + tex_desc.ArraySize = 1; + tex_desc.Format = FORMAT_R8G8B8A8_UNORM; + tex_desc.Usage = USAGE_IMMUTABLE; + tex_desc.BindFlags = BIND_SHADER_RESOURCE; + tex_desc.CPUAccessFlags = 0; + tex_desc.MiscFlags = 0; + + SubresourceData init_data; + init_data.pSysMem = buffer; + init_data.SysMemPitch = 0; + init_data.SysMemSlicePitch = 0; + + HRESULT hr = wiRenderer::GetDevice()->CreateTexture1D(&tex_desc, &init_data, &g_pFresnelMap); + assert(SUCCEEDED(hr)); + + delete[] buffer; + + + wiRenderer::GetDevice()->CreateTextureFromFile("perlin_noise.dds", &g_pPerlinMap, true, GRAPHICSTHREAD_IMMEDIATE); + + + // Constants + GPUBufferDesc cb_desc; + cb_desc.Usage = USAGE_DYNAMIC; + cb_desc.BindFlags = BIND_CONSTANT_BUFFER; + cb_desc.CPUAccessFlags = CPU_ACCESS_WRITE; + cb_desc.MiscFlags = 0; + cb_desc.ByteWidth = sizeof(Ocean_Rendering_PatchCB); + cb_desc.StructureByteStride = 0; + g_pPerCallCB = new GPUBuffer; + device->CreateBuffer(&cb_desc, nullptr, g_pPerCallCB); + + + cb_desc.Usage = USAGE_DYNAMIC; + cb_desc.CPUAccessFlags = CPU_ACCESS_WRITE; + cb_desc.ByteWidth = sizeof(Ocean_Rendering_ShadingCB); + cb_desc.StructureByteStride = 0; + g_pShadingCB = new GPUBuffer; + device->CreateBuffer(&cb_desc, nullptr, g_pShadingCB); + + // State blocks + RasterizerStateDesc ras_desc; + ras_desc.FillMode = FILL_SOLID; + ras_desc.CullMode = CULL_NONE; + ras_desc.FrontCounterClockwise = false; + ras_desc.DepthBias = 0; + ras_desc.SlopeScaledDepthBias = 0.0f; + ras_desc.DepthBiasClamp = 0.0f; + ras_desc.DepthClipEnable = true; + ras_desc.ScissorEnable = false; + ras_desc.MultisampleEnable = true; + ras_desc.AntialiasedLineEnable = false; + + g_pRSState_Solid = new RasterizerState; + device->CreateRasterizerState(&ras_desc, g_pRSState_Solid); + + ras_desc.FillMode = FILL_WIREFRAME; + + g_pRSState_Wireframe = new RasterizerState; + device->CreateRasterizerState(&ras_desc, g_pRSState_Wireframe); + + DepthStencilStateDesc depth_desc; + memset(&depth_desc, 0, sizeof(DepthStencilStateDesc)); + depth_desc.DepthEnable = true; + depth_desc.DepthWriteMask = DEPTH_WRITE_MASK_ALL; + depth_desc.DepthFunc = COMPARISON_GREATER; + depth_desc.StencilEnable = false; + g_pDSState_Disable = new DepthStencilState; + device->CreateDepthStencilState(&depth_desc, g_pDSState_Disable); + + BlendStateDesc blend_desc; + memset(&blend_desc, 0, sizeof(BlendStateDesc)); + blend_desc.AlphaToCoverageEnable = false; + blend_desc.IndependentBlendEnable = false; + blend_desc.RenderTarget[0].BlendEnable = true; + blend_desc.RenderTarget[0].SrcBlend = BLEND_SRC_ALPHA; + blend_desc.RenderTarget[0].DestBlend = BLEND_INV_SRC_ALPHA; + blend_desc.RenderTarget[0].BlendOp = BLEND_OP_ADD; + blend_desc.RenderTarget[0].SrcBlendAlpha = BLEND_ONE; + blend_desc.RenderTarget[0].DestBlendAlpha = BLEND_ZERO; + blend_desc.RenderTarget[0].BlendOpAlpha = BLEND_OP_ADD; + blend_desc.RenderTarget[0].RenderTargetWriteMask = COLOR_WRITE_ENABLE_ALL; + g_pBState_Transparent = new BlendState; + device->CreateBlendState(&blend_desc, g_pBState_Transparent); } void wiOcean::CleanUpStatic() { + fft512x512_destroy_plan(&m_fft_plan); + SAFE_DELETE(m_pUpdateSpectrumCS); SAFE_DELETE(m_pUpdateDisplacementMapCS); SAFE_DELETE(m_pUpdateGradientFoldingCS); - SAFE_DELETE(g_pMeshLayout); - SAFE_DELETE(g_pOceanSurfVS); SAFE_DELETE(g_pOceanSurfPS); SAFE_DELETE(g_pWireframePS); + + SAFE_DELETE(g_pMeshLayout); + + SAFE_DELETE(g_pFresnelMap); + SAFE_DELETE(g_pPerlinMap); + + SAFE_DELETE(g_pPerCallCB); + SAFE_DELETE(g_pShadingCB); + + SAFE_DELETE(g_pRSState_Solid); + SAFE_DELETE(g_pRSState_Wireframe); + SAFE_DELETE(g_pDSState_Disable); + SAFE_DELETE(g_pBState_Transparent); } diff --git a/WickedEngine/wiOcean.h b/WickedEngine/wiOcean.h index 23bcc0b87..56bf8ecdf 100644 --- a/WickedEngine/wiOcean.h +++ b/WickedEngine/wiOcean.h @@ -33,10 +33,21 @@ struct wiOceanParameter wiOceanParameter() { + // Original version: + //dmap_dim = 512; + //patch_length = 2000.0f; + //time_scale = 0.8f; + //wave_amplitude = 0.35f; + //wind_dir = XMFLOAT2(0.8f, 0.6f); + //wind_speed = 600.0f; + //wind_dependency = 0.07f; + //choppy_scale = 1.3f; + + // Scaled version: dmap_dim = 512; - patch_length = 2000.0f; + patch_length = 200.0f; time_scale = 0.8f; - wave_amplitude = 0.35f; + wave_amplitude = 80.0f; wind_dir = XMFLOAT2(0.8f, 0.6f); wind_speed = 600.0f; wind_dependency = 0.07f; @@ -102,7 +113,7 @@ protected: wiGraphicsTypes::GPUBuffer* m_pPerFrameCB; // FFT wrap-up - CSFFT512x512_Plan m_fft_plan; + static CSFFT512x512_Plan m_fft_plan; @@ -185,25 +196,24 @@ protected: static wiGraphicsTypes::VertexLayout* g_pMeshLayout; // Color look up 1D texture - wiGraphicsTypes::Texture1D* g_pFresnelMap = nullptr; + static wiGraphicsTypes::Texture1D* g_pFresnelMap; // Distant perlin wave - wiGraphicsTypes::Texture2D* g_pPerlinMap = nullptr; + static wiGraphicsTypes::Texture2D* g_pPerlinMap; // HLSL shaders static wiGraphicsTypes::VertexShader* g_pOceanSurfVS; static wiGraphicsTypes::PixelShader* g_pOceanSurfPS; static wiGraphicsTypes::PixelShader* g_pWireframePS; - wiGraphicsTypes::GPUBuffer* g_pPerCallCB = nullptr; - wiGraphicsTypes::GPUBuffer* g_pPerFrameCB = nullptr; - wiGraphicsTypes::GPUBuffer* g_pShadingCB = nullptr; + static wiGraphicsTypes::GPUBuffer* g_pPerCallCB; + static wiGraphicsTypes::GPUBuffer* g_pShadingCB; // State blocks - wiGraphicsTypes::RasterizerState* g_pRSState_Solid = nullptr; - wiGraphicsTypes::RasterizerState* g_pRSState_Wireframe = nullptr; - wiGraphicsTypes::DepthStencilState* g_pDSState_Disable = nullptr; - wiGraphicsTypes::BlendState* g_pBState_Transparent = nullptr; + static wiGraphicsTypes::RasterizerState* g_pRSState_Solid; + static wiGraphicsTypes::RasterizerState* g_pRSState_Wireframe; + static wiGraphicsTypes::DepthStencilState* g_pDSState_Disable; + static wiGraphicsTypes::BlendState* g_pBState_Transparent; // init & cleanup diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 8eee7be75..8818d8da4 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -937,6 +937,8 @@ void wiRenderer::ReloadShaders(const std::string& path) wiFont::LoadShaders(); wiImage::LoadShaders(); wiLensFlare::LoadShaders(); + wiOcean::LoadShaders(); + CSFFT_512x512_Data_t::LoadShaders(); GetDevice()->UNLOCK(); }