ocean updates

This commit is contained in:
Turanszki Janos
2017-11-12 15:27:17 +00:00
parent b5836181ae
commit 78d8583a87
6 changed files with 194 additions and 190 deletions
+6 -6
View File
@@ -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();
+1 -3
View File
@@ -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);
+1 -1
View File
@@ -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[] =
{
+162 -168
View File
@@ -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);
}
+22 -12
View File
@@ -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
+2
View File
@@ -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();
}