MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / Bind

Method Bind

Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp:31–96  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

29}
30
31void ForwardMaterialShader::Bind(BindParameters& params)
32{
33 // Prepare
34 auto context = params.GPUContext;
35 auto& view = params.RenderContext.View;
36 auto& drawCall = *params.DrawCall;
37 Span<byte> cb(_cbData.Get(), _cbData.Count());
38 int32 srv = 3;
39
40 // Setup features
41 if ((_info.FeaturesFlags & MaterialFeaturesFlags::GlobalIllumination) != MaterialFeaturesFlags::None)
42 {
43 GlobalIlluminationFeature::Bind(params, cb, srv);
44 if ((_info.FeaturesFlags & MaterialFeaturesFlags::ScreenSpaceReflections) != MaterialFeaturesFlags::None)
45 SDFReflectionsFeature::Bind(params, cb, srv);
46 }
47 ForwardShadingFeature::Bind(params, cb, srv);
48
49 // Setup parameters
50 MaterialParameter::BindMeta bindMeta;
51 bindMeta.Context = context;
52 bindMeta.Constants = cb;
53 bindMeta.Input = params.Input;
54 bindMeta.Buffers = params.RenderContext.Buffers;
55 bindMeta.CanSampleDepth = GPUDevice::Instance->Limits.HasReadOnlyDepth;
56 bindMeta.CanSampleGBuffer = true;
57 MaterialParams::Bind(params.ParamsLink, bindMeta);
58 context->BindSR(0, params.ObjectBuffer);
59
60 // Check if using mesh skinning
61 const bool useSkinning = drawCall.Surface.Skinning != nullptr;
62 if (useSkinning)
63 {
64 // Bind skinning buffer
65 ASSERT(drawCall.Surface.Skinning->IsReady());
66 context->BindSR(1, drawCall.Surface.Skinning->BoneMatrices->View());
67 }
68
69 // Bind constants
70 if (_cb)
71 {
72 context->UpdateCB(_cb, _cbData.Get());
73 context->BindCB(0, _cb);
74 }
75
76 // Select pipeline state based on current pass and render mode
77 const bool wireframe = (_info.FeaturesFlags & MaterialFeaturesFlags::Wireframe) != MaterialFeaturesFlags::None || view.Mode == ViewMode::Wireframe;
78 CullMode cullMode = view.Pass == DrawPass::Depth ? CullMode::TwoSided : _info.CullMode;
79#if USE_EDITOR
80 if (IsRunningRadiancePass)
81 cullMode = CullMode::TwoSided;
82#endif
83 if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminant)
84 {
85 // Invert culling when scale is negative
86 cullMode = cullMode == CullMode::Normal ? CullMode::Inverted : CullMode::Normal;
87 }
88 ASSERT_LOW_LAYER(!(useSkinning && params.Instanced)); // No support for instancing skinned meshes

Callers

nothing calls this directly

Calls 10

BindFunction · 0.85
GetMethod · 0.45
CountMethod · 0.45
BindSRMethod · 0.45
IsReadyMethod · 0.45
ViewMethod · 0.45
UpdateCBMethod · 0.45
BindCBMethod · 0.45
GetPSMethod · 0.45
SetStateMethod · 0.45

Tested by

no test coverage detected