23 if (
_scene->clusteredLightingEnabled())
25 const auto lighting =
_scene->lighting();
34 std::vector<Light*> localShadowLights;
37 if (!lightComponent || !lightComponent->enabled()) {
43 if (!lightComponent->castShadows()) {
46 Light* sceneLight = lightComponent->light();
48 localShadowLights.push_back(sceneLight);
51 if (!localShadowLights.empty()) {
65 std::unordered_set<Camera*> culledCameras;
66 for (
const auto* action : actions) {
67 if (action && action->camera) {
68 Camera* cam = action->camera->camera();
69 if (cam && culledCameras.insert(cam).second) {
83 const auto& renderActions = layerComposition->
renderActions();
85 for (
int i = startIndex; i < renderActions.size(); i++) {
86 if (
auto* renderAction = renderActions[i]; renderAction->useCameraPasses) {
88 for (
auto renderPass : renderAction->camera->renderPasses()) {
94 const auto isDepthLayer = renderAction->layer->id() ==
LAYERID_DEPTH;
95 const auto isGrabPass = isDepthLayer &&
96 (renderAction->camera->renderSceneColorMap() || renderAction->camera->renderSceneDepthMap());
102 renderTarget = renderAction->renderTarget.get();
106 auto* nextRenderAction = (i + 1 < renderActions.size()) ? renderActions[i + 1] :
nullptr;
107 const auto isNextLayerDepth = nextRenderAction ? (!nextRenderAction->useCameraPasses && nextRenderAction->layer->id() ==
LAYERID_DEPTH) :
false;
108 const auto isNextLayerGrabPass = isNextLayerDepth &&
109 (renderAction->camera->renderSceneColorMap() || renderAction->camera->renderSceneDepthMap());
111 auto* camera = (nextRenderAction && nextRenderAction->camera) ? nextRenderAction->camera->camera() :
nullptr;
112 const auto nextNeedDirShadows = nextRenderAction ?
120 const bool nextIsNonGrabDepth = isNextLayerDepth && !isNextLayerGrabPass;
121 const bool rtChanged = nextRenderAction && nextRenderAction->renderTarget.get() != renderTarget && !nextIsNonGrabDepth;
125 if (!nextRenderAction || rtChanged || nextNeedDirShadows ||
126 isNextLayerGrabPass || isGrabPass) {
128 const bool useCameraFrame = renderAction->triggerPostprocess && renderAction->camera &&
129 renderAction->camera->onPostprocessing() !=
nullptr;
132 if (
const auto isDepthOnly = isDepthLayer && startIndex == i; !isDepthOnly) {
133 if (useCameraFrame) {
134 std::vector<RenderAction*> blockActions;
135 blockActions.reserve(
static_cast<size_t>(i - startIndex + 1));
136 for (
int actionIndex = startIndex; actionIndex <= i; ++actionIndex) {
137 auto* blockAction = renderActions[actionIndex];
139 blockActions.push_back(blockAction);
142 if (!blockActions.empty()) {
148 auto cameraFramePass = renderAction->camera->cameraFrame();
149 if (!cameraFramePass) {
150 cameraFramePass = std::make_shared<RenderPassCameraFrame>(
151 _device, layerComposition,
_scene.get(),
this, blockActions, renderAction->camera,
nullptr);
152 renderAction->camera->setCameraFrame(cameraFramePass);
154 cameraFramePass->updateSourceActions(
155 blockActions, layerComposition,
_scene.get(),
this,
nullptr);
165 if (isDepthLayer && !useCameraFrame) {
166 if (renderAction->camera->renderSceneColorMap()) {
167 const auto colorGrabPass = renderAction->camera->camera()->renderPassColorGrab();
169 colorGrabPass->setSource(renderAction->renderTarget);
174 if (renderAction->camera->renderSceneDepthMap()) {
175 const auto depthGrabPass = renderAction->camera->camera()->renderPassDepthGrab();
183 if (!useCameraFrame && renderAction->triggerPostprocess && renderAction->camera &&
184 renderAction->camera->onPostprocessing()) {
185 auto renderPass = std::make_shared<RenderPassPostprocessing>(
_device,
this, renderAction);
196 RenderTarget* renderTarget,
int startIndex,
int endIndex)
198 if (!frameGraph || !layerComposition) {
202 const auto& renderActions = layerComposition->
renderActions();
203 if (renderActions.empty() || startIndex < 0 || endIndex < startIndex ||
204 static_cast<size_t>(endIndex) >= renderActions.size()) {
208 auto* firstRenderAction = renderActions[startIndex];
209 if (!firstRenderAction || !firstRenderAction->camera) {
213 std::shared_ptr<RenderTarget> passTarget = firstRenderAction->renderTarget;
214 if (!passTarget && renderTarget !=
nullptr) {
216 passTarget = firstRenderAction->camera->camera() ? firstRenderAction->camera->camera()->renderTarget() :
nullptr;
219 auto mainPass = std::make_shared<RenderPassForward>(
222 mainPass->init(passTarget);
224 for (
int i = startIndex; i <= endIndex; ++i) {
225 auto* ra = renderActions[i];
229 const auto* cameraForAction = ra->camera;
230 bool hasPreviousForCamera =
false;
231 bool hasNextForCamera =
false;
233 for (
int j = startIndex; j < i; ++j) {
234 if (renderActions[j] && renderActions[j]->camera == cameraForAction) {
235 hasPreviousForCamera =
true;
239 for (
int j = i + 1; j <= endIndex; ++j) {
240 if (renderActions[j] && renderActions[j]->camera == cameraForAction) {
241 hasNextForCamera =
true;
246 ra->firstCameraUse = !hasPreviousForCamera;
247 ra->lastCameraUse = !hasNextForCamera;
248 mainPass->addRenderAction(ra);