2024-08-13 22:44:04 +02:00
|
|
|
#pragma once
|
|
|
|
|
#include "RenderPass.h"
|
|
|
|
|
|
|
|
|
|
namespace Seele {
|
|
|
|
|
class WaterRenderer {
|
|
|
|
|
public:
|
|
|
|
|
WaterRenderer(Gfx::PGraphics graphics, PScene scene, Gfx::PDescriptorLayout viewParamsLayout);
|
|
|
|
|
~WaterRenderer();
|
|
|
|
|
void beginFrame();
|
|
|
|
|
Gfx::ORenderCommand render(Gfx::PDescriptorSet viewParamsSet);
|
|
|
|
|
void setViewport(Gfx::PViewport viewport, Gfx::PRenderPass renderPass);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
float jonswapAlpha(float fetch, float windSpeed) const;
|
|
|
|
|
float jonswapPeakFrequency(float fetch, float windSpeed) const;
|
|
|
|
|
void updateFFTDescriptor();
|
|
|
|
|
void updateMaterialDescriptor();
|
|
|
|
|
Gfx::PGraphics graphics;
|
|
|
|
|
PScene scene;
|
|
|
|
|
Gfx::ODescriptorLayout computeLayout;
|
|
|
|
|
Gfx::PDescriptorSet computeSet;
|
|
|
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
|
|
|
|
|
|
|
|
Gfx::OComputeShader initSpectrumCS;
|
|
|
|
|
Gfx::PComputePipeline initSpectrum;
|
|
|
|
|
Gfx::OComputeShader packSpectrumConjugateCS;
|
|
|
|
|
Gfx::PComputePipeline packSpectrumConjugate;
|
|
|
|
|
Gfx::OComputeShader updateSpectrumForFFTCS;
|
|
|
|
|
Gfx::PComputePipeline updateSpectrumForFFT;
|
|
|
|
|
Gfx::OComputeShader horizontalFFTCS;
|
|
|
|
|
Gfx::PComputePipeline horizontalFFT;
|
|
|
|
|
Gfx::OComputeShader verticalFFTCS;
|
|
|
|
|
Gfx::PComputePipeline verticalFFT;
|
|
|
|
|
Gfx::OComputeShader assembleMapsCS;
|
|
|
|
|
Gfx::PComputePipeline assembleMaps;
|
|
|
|
|
|
|
|
|
|
struct SpectrumParameters {
|
|
|
|
|
float scale;
|
|
|
|
|
float angle;
|
|
|
|
|
float spreadBlend;
|
|
|
|
|
float swell;
|
|
|
|
|
float alpha;
|
|
|
|
|
float peakOmega;
|
|
|
|
|
float gamma;
|
|
|
|
|
float shortWavesFade;
|
|
|
|
|
};
|
|
|
|
|
StaticArray<SpectrumParameters, 8> spectrums;
|
|
|
|
|
struct DisplaySpectrumSettings {
|
|
|
|
|
float scale = 1;
|
|
|
|
|
float windSpeed = 1;
|
|
|
|
|
float windDirection = 0;
|
|
|
|
|
float fetch = 1;
|
|
|
|
|
float spreadBlend = 1;
|
|
|
|
|
float swell = 1;
|
|
|
|
|
float peakEnhancement = 1;
|
|
|
|
|
float shortWavesFade = 1;
|
|
|
|
|
};
|
|
|
|
|
StaticArray<DisplaySpectrumSettings, 8> displaySpectrums;
|
|
|
|
|
struct ComputeParams {
|
|
|
|
|
float frameTime;
|
|
|
|
|
float deltaTime;
|
|
|
|
|
float gravity = 9.81f;
|
|
|
|
|
float repeatTime = 200.0f;
|
|
|
|
|
float depth = 20.0f;
|
|
|
|
|
float lowCutoff = 0.0001f;
|
|
|
|
|
float highCutoff = 9000.0f;
|
2024-08-17 15:11:57 +02:00
|
|
|
int seed = 1;
|
2024-08-13 22:44:04 +02:00
|
|
|
Vector2 lambda = Vector2(1, 1);
|
|
|
|
|
uint32 N = 1024;
|
2024-08-17 15:11:57 +02:00
|
|
|
|
|
|
|
|
// Layer 1
|
|
|
|
|
uint32 lengthScale1 = 94;
|
|
|
|
|
|
|
|
|
|
// Layer 2
|
|
|
|
|
uint32 lengthScale2 = 128;
|
|
|
|
|
|
|
|
|
|
// Layer 3
|
|
|
|
|
uint32 lengthScale3 = 64;
|
|
|
|
|
|
|
|
|
|
// Layer 4
|
|
|
|
|
uint32 lengthScale4 = 32;
|
|
|
|
|
|
|
|
|
|
float foamBias = 0.85f;
|
|
|
|
|
float foamDecayRate = 0.0175f;
|
|
|
|
|
float foamAdd = 0.1f;
|
2024-08-13 22:44:04 +02:00
|
|
|
float foamThreshold = 0.0f;
|
|
|
|
|
} params;
|
|
|
|
|
float speed = 1.0f;
|
|
|
|
|
float displacementDepthFalloff = 1.0f;
|
|
|
|
|
uint32 logN;
|
|
|
|
|
uint32 threadGroupsX;
|
|
|
|
|
uint32 threadGroupsY;
|
|
|
|
|
Gfx::OUniformBuffer paramsBuffer;
|
|
|
|
|
Gfx::OTexture2D spectrumTextures, initialSpectrumTextures, displacementTextures;
|
|
|
|
|
Gfx::OTexture2D slopeTextures;
|
|
|
|
|
Gfx::OTexture2D boyancyData;
|
|
|
|
|
Gfx::OShaderBuffer spectrumBuffer;
|
|
|
|
|
Gfx::OSampler linearRepeatSampler;
|
|
|
|
|
|
|
|
|
|
struct MaterialParams {
|
2024-08-17 15:11:57 +02:00
|
|
|
Vector sunDirection = Vector(-1.29f, -1.0f, 4.86f);
|
2024-08-13 22:44:04 +02:00
|
|
|
float displacementDepthAttenuation = 1;
|
|
|
|
|
|
2024-08-17 15:11:57 +02:00
|
|
|
float foamSubtract0 = 0.04f;
|
|
|
|
|
float foamSubtract1 = -0.04f;
|
|
|
|
|
float foamSubtract2 = -0.46f;
|
|
|
|
|
float foamSubtract3 = -0.38f;
|
|
|
|
|
|
|
|
|
|
float tile1 = 0.01f;
|
|
|
|
|
float tile2 = 3.0f;
|
|
|
|
|
float tile3 = 3.0f;
|
|
|
|
|
float tile4 = 0.13f;
|
2024-08-13 22:44:04 +02:00
|
|
|
|
|
|
|
|
float normalStrength = 1;
|
|
|
|
|
float foamDepthAttenuation = 1;
|
|
|
|
|
float normalDepthAttenuation = 1;
|
2024-08-17 15:11:57 +02:00
|
|
|
float roughness = 0.075f;
|
2024-08-13 22:44:04 +02:00
|
|
|
|
2024-08-17 15:11:57 +02:00
|
|
|
Vector sunIrradiance = Vector(1.0f, 0.694f, 0.32f);
|
|
|
|
|
float foamRoughnessModifier = 0;
|
2024-08-13 22:44:04 +02:00
|
|
|
|
2024-08-17 15:11:57 +02:00
|
|
|
Vector scatterColor = Vector(0.016f, 0.0735f, 0.16f);
|
|
|
|
|
float environmentLightStrength = 0.5f;
|
2024-08-13 22:44:04 +02:00
|
|
|
|
2024-08-17 15:11:57 +02:00
|
|
|
Vector bubbleColor = Vector(0, 0.02f, 0.016f);
|
2024-08-13 22:44:04 +02:00
|
|
|
float heightModifier = 1;
|
|
|
|
|
|
|
|
|
|
float bubbleDensity = 1;
|
|
|
|
|
float wavePeakScatterStrength = 1;
|
|
|
|
|
float scatterStrength = 1;
|
2024-08-17 15:11:57 +02:00
|
|
|
float scatterShadowStrength = 0.5f;
|
2024-08-13 22:44:04 +02:00
|
|
|
|
2024-08-17 15:11:57 +02:00
|
|
|
uint32 contributeDisplacement1 = true;
|
|
|
|
|
uint32 contributeDisplacement2 = false;
|
|
|
|
|
uint32 contributeDisplacement3 = false;
|
|
|
|
|
uint32 contributeDisplacement4 = false;
|
|
|
|
|
|
|
|
|
|
Vector foamColor = Vector(0.6f, 0.5568f, 0.492f);
|
2024-08-13 22:44:04 +02:00
|
|
|
} materialParams;
|
|
|
|
|
// Water
|
|
|
|
|
Gfx::OUniformBuffer materialUniforms;
|
|
|
|
|
Gfx::PTextureCube skyBox;
|
|
|
|
|
Gfx::OShaderBuffer waterTiles;
|
|
|
|
|
Gfx::OTaskShader waterTask;
|
|
|
|
|
Gfx::OMeshShader waterMesh;
|
|
|
|
|
Gfx::OFragmentShader waterFragment;
|
|
|
|
|
Gfx::ODescriptorLayout materialLayout;
|
|
|
|
|
Gfx::PDescriptorSet materialSet;
|
|
|
|
|
Gfx::OPipelineLayout waterLayout;
|
|
|
|
|
Gfx::PGraphicsPipeline waterPipeline;
|
|
|
|
|
|
|
|
|
|
Gfx::PViewport viewport;
|
|
|
|
|
};
|
|
|
|
|
DEFINE_REF(WaterRenderer)
|
|
|
|
|
}
|