| 26 | }); |
| 27 | |
| 28 | void PostFxMaterialShader::Bind(BindParameters& params) |
| 29 | { |
| 30 | // Prepare |
| 31 | auto context = params.GPUContext; |
| 32 | auto& view = params.RenderContext.View; |
| 33 | Span<byte> cb(_cbData.Get(), _cbData.Count()); |
| 34 | ASSERT_LOW_LAYER(cb.Length() >= sizeof(PostFxMaterialShaderData)); |
| 35 | auto materialData = reinterpret_cast<PostFxMaterialShaderData*>(cb.Get()); |
| 36 | cb = cb.Slice(sizeof(PostFxMaterialShaderData)); |
| 37 | int32 srv = 0; |
| 38 | |
| 39 | // Setup parameters |
| 40 | MaterialParameter::BindMeta bindMeta; |
| 41 | bindMeta.Context = context; |
| 42 | bindMeta.Constants = cb; |
| 43 | bindMeta.Input = params.Input; |
| 44 | bindMeta.Buffers = params.RenderContext.Buffers; |
| 45 | bindMeta.CanSampleDepth = true; |
| 46 | bindMeta.CanSampleGBuffer = true; |
| 47 | MaterialParams::Bind(params.ParamsLink, bindMeta); |
| 48 | |
| 49 | // Setup material constants |
| 50 | { |
| 51 | Matrix::Transpose(view.View, materialData->ViewMatrix); |
| 52 | Matrix::Transpose(view.IVP, materialData->InverseViewProjectionMatrix); |
| 53 | materialData->ViewPos = view.Position; |
| 54 | materialData->ViewFar = view.Far; |
| 55 | materialData->ViewDir = view.Direction; |
| 56 | materialData->TimeParam = params.Time; |
| 57 | materialData->ScaledTimeParam = params.ScaledTime; |
| 58 | materialData->ViewInfo = view.ViewInfo; |
| 59 | materialData->ScreenSize = view.ScreenSize; |
| 60 | materialData->TemporalAAJitter = view.TemporalAAJitter; |
| 61 | } |
| 62 | |
| 63 | // Bind constants |
| 64 | if (_cb) |
| 65 | { |
| 66 | context->UpdateCB(_cb, _cbData.Get()); |
| 67 | context->BindCB(0, _cb); |
| 68 | } |
| 69 | |
| 70 | // Bind pipeline |
| 71 | context->SetState(_cache.Default); |
| 72 | } |
| 73 | |
| 74 | void PostFxMaterialShader::Unload() |
| 75 | { |