void CombinePassPingPong(CommandBuffer buf) { var lodCount = OceanRenderer.Instance.CurrentLodCount; const int shaderPassCombineIntoAux = 0, shaderPassCopyResultBack = 1; // combine waves for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { // The per-octave wave buffers BindWaveBuffer(_combineMaterial[lodIdx], false); // Bind this LOD data (displacements). Option to disable the combine pass - very useful debugging feature. if (_shapeCombinePass) { BindResultData(_combineMaterial[lodIdx]); } else { BindNull(_combineMaterial[lodIdx]); } // Dynamic waves if (OceanRenderer.Instance._lodDataDynWaves) { OceanRenderer.Instance._lodDataDynWaves.BindCopySettings(_combineMaterial[lodIdx]); OceanRenderer.Instance._lodDataDynWaves.BindResultData(_combineMaterial[lodIdx]); } else { LodDataMgrDynWaves.BindNull(_combineMaterial[lodIdx]); } // Flow if (OceanRenderer.Instance._lodDataFlow) { OceanRenderer.Instance._lodDataFlow.BindResultData(_combineMaterial[lodIdx]); } else { LodDataMgrFlow.BindNull(_combineMaterial[lodIdx]); } _combineMaterial[lodIdx].SetInt(sp_LD_SliceIndex, lodIdx); // Combine this LOD's waves with waves from the LODs above into auxiliary combine buffer buf.SetRenderTarget(_combineBuffer); buf.DrawProcedural(Matrix4x4.identity, _combineMaterial[lodIdx].material, shaderPassCombineIntoAux, MeshTopology.Triangles, 3); // Copy combine buffer back to lod texture array buf.SetRenderTarget(_targets, 0, CubemapFace.Unknown, lodIdx); _combineMaterial[lodIdx].SetTexture(Shader.PropertyToID("_CombineBuffer"), _combineBuffer); buf.DrawProcedural(Matrix4x4.identity, _combineMaterial[lodIdx].material, shaderPassCopyResultBack, MeshTopology.Triangles, 3); } }
public override void BuildCommandBuffer(OceanRenderer ocean, CommandBuffer buf) { base.BuildCommandBuffer(ocean, buf); var lodCount = OceanRenderer.Instance.CurrentLodCount; // lod-dependent data _filterWavelength._lodCount = lodCount; for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { buf.SetRenderTarget(_waveBuffers, 0, CubemapFace.Unknown, lodIdx); buf.ClearRenderTarget(false, true, Color.black); foreach (var gerstner in _gerstnerComponents) { gerstner.BuildCommandBuffer(lodIdx, ocean, buf); } // draw any data with lod preference _filterWavelength._lodIdx = lodIdx; _filterWavelength._lodMaxWavelength = OceanRenderer.Instance._lodTransform.MaxWavelength(lodIdx); _filterWavelength._lodMinWavelength = _filterWavelength._lodMaxWavelength / 2f; SubmitDrawsFiltered(lodIdx, buf, _filterWavelength); } int combineShaderKernel = krnl_ShapeCombine; int combineShaderKernel_lastLOD = krnl_ShapeCombine_DISABLE_COMBINE; { bool isFlowOn = OceanRenderer.Instance._lodDataFlow != null; bool isDynWavesOn = OceanRenderer.Instance._lodDataDynWaves != null; // set the shader kernels that we will use. if (isFlowOn && isDynWavesOn) { combineShaderKernel = krnl_ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON; combineShaderKernel_lastLOD = krnl_ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON_DISABLE_COMBINE; } else if (isFlowOn) { combineShaderKernel = krnl_ShapeCombine_FLOW_ON; combineShaderKernel_lastLOD = krnl_ShapeCombine_FLOW_ON_DISABLE_COMBINE; } else if (isDynWavesOn) { combineShaderKernel = krnl_ShapeCombine_DYNAMIC_WAVE_SIM_ON; combineShaderKernel_lastLOD = krnl_ShapeCombine_DYNAMIC_WAVE_SIM_ON_DISABLE_COMBINE; } } // combine waves for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { int selectedShaderKernel; if (lodIdx < lodCount - 1 && _shapeCombinePass) { selectedShaderKernel = combineShaderKernel; } else { selectedShaderKernel = combineShaderKernel_lastLOD; } _combineProperties.Initialise(buf, _combineShader, selectedShaderKernel); BindWaveBuffer(_combineProperties); BindResultData(_combineProperties); // dynamic waves if (OceanRenderer.Instance._lodDataDynWaves) { OceanRenderer.Instance._lodDataDynWaves.BindCopySettings(_combineProperties); OceanRenderer.Instance._lodDataDynWaves.BindResultData(_combineProperties); } else { LodDataMgrDynWaves.BindNull(_combineProperties); } // flow if (OceanRenderer.Instance._lodDataFlow) { OceanRenderer.Instance._lodDataFlow.BindResultData(_combineProperties); } else { LodDataMgrFlow.BindNull(_combineProperties); } // Set the animated waves texture where the results will be combined. _combineProperties.SetTexture( sp_LD_TexArray_AnimatedWaves_Compute, DataTexture ); _combineProperties.SetFloat(OceanRenderer.sp_LD_SliceIndex, lodIdx); _combineProperties.DispatchShader(); } // lod-independent data for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { buf.SetRenderTarget(_targets, 0, CubemapFace.Unknown, lodIdx); // draw any data that did not express a preference for one lod or another SubmitDrawsFiltered(lodIdx, buf, _filterNoLodPreference); } }
void CombinePassCompute(CommandBuffer buf) { var lodCount = OceanRenderer.Instance.CurrentLodCount; int combineShaderKernel = krnl_ShapeCombine; int combineShaderKernel_lastLOD = krnl_ShapeCombine_DISABLE_COMBINE; { bool isFlowOn = OceanRenderer.Instance._lodDataFlow != null; bool isDynWavesOn = OceanRenderer.Instance._lodDataDynWaves != null; // set the shader kernels that we will use. if (isFlowOn && isDynWavesOn) { combineShaderKernel = krnl_ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON; combineShaderKernel_lastLOD = krnl_ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON_DISABLE_COMBINE; } else if (isFlowOn) { combineShaderKernel = krnl_ShapeCombine_FLOW_ON; combineShaderKernel_lastLOD = krnl_ShapeCombine_FLOW_ON_DISABLE_COMBINE; } else if (isDynWavesOn) { combineShaderKernel = krnl_ShapeCombine_DYNAMIC_WAVE_SIM_ON; combineShaderKernel_lastLOD = krnl_ShapeCombine_DYNAMIC_WAVE_SIM_ON_DISABLE_COMBINE; } } // combine waves for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { int selectedShaderKernel; if (lodIdx < lodCount - 1 && _shapeCombinePass) { selectedShaderKernel = combineShaderKernel; } else { selectedShaderKernel = combineShaderKernel_lastLOD; } _combineProperties.Initialise(buf, _combineShader, selectedShaderKernel); // The per-octave wave buffers BindWaveBuffer(_combineProperties); // Bind this LOD data (displacements) BindResultData(_combineProperties); // Dynamic waves if (OceanRenderer.Instance._lodDataDynWaves) { OceanRenderer.Instance._lodDataDynWaves.BindCopySettings(_combineProperties); OceanRenderer.Instance._lodDataDynWaves.BindResultData(_combineProperties); } else { LodDataMgrDynWaves.BindNull(_combineProperties); } // Flow if (OceanRenderer.Instance._lodDataFlow) { OceanRenderer.Instance._lodDataFlow.BindResultData(_combineProperties); } else { LodDataMgrFlow.BindNull(_combineProperties); } // Set the animated waves texture where the results will be combined. _combineProperties.SetTexture( sp_LD_TexArray_AnimatedWaves_Compute, DataTexture ); _combineProperties.SetInt(sp_LD_SliceIndex, lodIdx); _combineProperties.DispatchShader(); } }
public override void BuildCommandBuffer(OceanRenderer ocean, CommandBuffer buf) { base.BuildCommandBuffer(ocean, buf); var lodCount = OceanRenderer.Instance.CurrentLodCount; // lod-dependent data for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { buf.SetRenderTarget(_waveBuffers[lodIdx]); buf.ClearRenderTarget(false, true, Color.black); foreach (var gerstner in _gerstnerComponents) { gerstner.BuildCommandBuffer(lodIdx, ocean, buf); } // draw any data with lod preference var lodMaxWavelength = OceanRenderer.Instance._lods[lodIdx].MaxWavelength(); var lodMinWavelength = lodMaxWavelength / 2f; DrawFilter filter = (data) => { var drawOctaveWavelength = (data as RegisterAnimWavesInput).OctaveWavelength; return(lodMinWavelength <= drawOctaveWavelength && drawOctaveWavelength < lodMaxWavelength); }; SubmitDrawsFiltered(lodIdx, buf, filter); } // combine waves for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { // this lod data BindWaveBuffer(lodIdx, 0, _combineMaterial[lodIdx], false); // combine data from next larger lod into this one if (lodIdx < lodCount - 1 && _shapeCombinePass) { BindResultData(lodIdx + 1, 1, _combineMaterial[lodIdx]); } else { // this binds black texture BindWaveBuffer(lodIdx, 1, _combineMaterial[lodIdx], true); } // dynamic waves if (OceanRenderer.Instance._lodDataDynWaves) { OceanRenderer.Instance._lodDataDynWaves.BindCopySettings(_combineMaterial[lodIdx]); OceanRenderer.Instance._lodDataDynWaves.BindResultData(lodIdx, 0, _combineMaterial[lodIdx]); } else { LodDataMgrDynWaves.BindNull(0, _combineMaterial[lodIdx]); } // flow if (OceanRenderer.Instance._lodDataFlow) { OceanRenderer.Instance._lodDataFlow.BindResultData(lodIdx, 0, _combineMaterial[lodIdx]); } else { LodDataMgrFlow.BindNull(0, _combineMaterial[lodIdx]); } buf.Blit(null, DataTexture(lodIdx), _combineMaterial[lodIdx]); } // lod-independent data for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { buf.SetRenderTarget(DataTexture(lodIdx)); // draw any data that did not express a preference for one lod or another DrawFilter filter = (data) => { return((data as RegisterAnimWavesInput).OctaveWavelength == 0f); }; SubmitDrawsFiltered(lodIdx, buf, filter); } }
public override void BuildCommandBuffer(OceanRenderer ocean, CommandBuffer buf) { base.BuildCommandBuffer(ocean, buf); var lodCount = OceanRenderer.Instance.CurrentLodCount; // lod-dependent data _filterWavelength._lodCount = lodCount; for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { buf.SetRenderTarget(_waveBuffers[lodIdx]); buf.ClearRenderTarget(false, true, Color.black); foreach (var gerstner in _gerstnerComponents) { gerstner.BuildCommandBuffer(lodIdx, ocean, buf); } // draw any data with lod preference _filterWavelength._lodIdx = lodIdx; _filterWavelength._lodMaxWavelength = OceanRenderer.Instance._lods[lodIdx].MaxWavelength(); _filterWavelength._lodMinWavelength = _filterWavelength._lodMaxWavelength / 2f; SubmitDrawsFiltered(lodIdx, buf, _filterWavelength); } // combine waves for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { // this lod data BindWaveBuffer(lodIdx, 0, _combineProperties[lodIdx], false); // combine data from next larger lod into this one if (lodIdx < lodCount - 1 && _shapeCombinePass) { BindResultData(lodIdx + 1, 1, _combineProperties[lodIdx]); } else { // this binds black texture BindWaveBuffer(lodIdx, 1, _combineProperties[lodIdx], true); } // dynamic waves if (OceanRenderer.Instance._lodDataDynWaves) { OceanRenderer.Instance._lodDataDynWaves.BindCopySettings(_combineProperties[lodIdx]); OceanRenderer.Instance._lodDataDynWaves.BindResultData(lodIdx, 0, _combineProperties[lodIdx]); } else { LodDataMgrDynWaves.BindNull(0, _combineProperties[lodIdx]); } // flow if (OceanRenderer.Instance._lodDataFlow) { OceanRenderer.Instance._lodDataFlow.BindResultData(lodIdx, 0, _combineProperties[lodIdx]); } else { LodDataMgrFlow.BindNull(0, _combineProperties[lodIdx]); } buf.SetRenderTarget(DataTexture(lodIdx)); buf.DrawProcedural(Matrix4x4.identity, _combineMaterial, 0, MeshTopology.Triangles, 3, 1, _combineProperties[lodIdx].materialPropertyBlock); } // lod-independent data for (int lodIdx = lodCount - 1; lodIdx >= 0; lodIdx--) { buf.SetRenderTarget(DataTexture(lodIdx)); // draw any data that did not express a preference for one lod or another SubmitDrawsFiltered(lodIdx, buf, _filterNoLodPreference); } }