void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { auto deferredTransform = inputs.get0(); auto deferredFramebuffer = inputs.get1(); auto lightingModel = inputs.get2(); auto surfaceGeometryFramebuffer = inputs.get3(); auto ssaoFramebuffer = inputs.get4(); auto subsurfaceScatteringResource = inputs.get5(); auto args = renderContext->args; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { _gpuTimer.begin(batch); }); setupJob.run(sceneContext, renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, ssaoFramebuffer, subsurfaceScatteringResource); lightsJob.run(sceneContext, renderContext, deferredTransform, deferredFramebuffer, lightingModel); cleanupJob.run(sceneContext, renderContext); gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { _gpuTimer.end(batch); }); auto config = std::static_pointer_cast<Config>(renderContext->jobConfig); config->setGPUBatchRunTime(_gpuTimer.getGPUAverage(), _gpuTimer.getBatchAverage()); }
void RenderDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs) { auto args = renderContext->args; auto deferredTransform = inputs.get0(); auto deferredFramebuffer = inputs.get1(); auto extraRenderBuffers = inputs.get2(); auto surfaceGeometryFramebuffer = extraRenderBuffers.get0(); auto ssaoFramebuffer = extraRenderBuffers.get1(); auto subsurfaceScatteringResource = extraRenderBuffers.get2(); auto lightingModel = inputs.get3(); auto lightClusters = inputs.get4(); const auto& lightFrame = inputs.get5(); const auto& shadowFrame = inputs.get6(); const auto& hazeFrame = inputs.get7(); if (!_gpuTimer) { _gpuTimer = std::make_shared < gpu::RangeTimer>(__FUNCTION__); } auto previousBatch = args->_batch; gpu::doInBatch(nullptr, args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; _gpuTimer->begin(batch); setupJob.run(renderContext, deferredTransform, deferredFramebuffer, lightingModel, lightFrame, shadowFrame, hazeFrame, surfaceGeometryFramebuffer, ssaoFramebuffer, subsurfaceScatteringResource); lightsJob.run(renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, lightClusters); cleanupJob.run(renderContext); _gpuTimer->end(batch); }); args->_batch = previousBatch; auto config = std::static_pointer_cast<Config>(renderContext->jobConfig); config->setGPUBatchRunTime(_gpuTimer->getGPUAverage(), _gpuTimer->getBatchAverage()); }
void DebugSubsurfaceScattering::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; auto& frameTransform = inputs.get0(); auto& deferredFramebuffer = inputs.get1(); auto& surfaceGeometryFramebuffer = inputs.get3(); auto curvatureFramebuffer = surfaceGeometryFramebuffer->getCurvatureFramebuffer(); auto linearDepthTexture = surfaceGeometryFramebuffer->getLinearDepthTexture(); auto& diffusedFramebuffer = inputs.get4(); auto& scatteringResource = inputs.get5(); if (!scatteringResource) { return; } auto scatteringProfile = scatteringResource->getScatteringProfile(); auto scatteringTable = scatteringResource->getScatteringTable(); auto scatteringSpecular = scatteringResource->getScatteringSpecular(); const auto theLight = DependencyManager::get<DeferredLightingEffect>()->getLightStage().lights[0]; gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); auto viewportSize = std::min(args->_viewport.z, args->_viewport.w) >> 1; auto offsetViewport = viewportSize * 0.1; if (_showProfile) { batch.setViewportTransform(glm::ivec4(0, 0, viewportSize, offsetViewport)); batch.setPipeline(getShowLUTPipeline()); batch.setResourceTexture(0, scatteringProfile); batch.draw(gpu::TRIANGLE_STRIP, 4); } if (_showLUT) { batch.setViewportTransform(glm::ivec4(0, offsetViewport * 1.5, viewportSize, viewportSize)); batch.setPipeline(getShowLUTPipeline()); batch.setResourceTexture(0, scatteringTable); batch.draw(gpu::TRIANGLE_STRIP, 4); if (_showCursorPixel) { auto debugScatteringPipeline = getScatteringPipeline(); batch.setPipeline(debugScatteringPipeline); Transform model; model.setTranslation(glm::vec3(0.0, offsetViewport * 1.5 / args->_viewport.w, 0.0)); model.setScale(glm::vec3(viewportSize / (float)args->_viewport.z, viewportSize / (float)args->_viewport.w, 1.0)); batch.setModelTransform(model); batch.setUniformBuffer(ScatteringTask_FrameTransformSlot, frameTransform->getFrameTransformBuffer()); batch.setUniformBuffer(ScatteringTask_ParamSlot, scatteringResource->getParametersBuffer()); if (theLight->light) { batch.setUniformBuffer(ScatteringTask_LightSlot, theLight->light->getSchemaBuffer()); } batch.setResourceTexture(ScatteringTask_ScatteringTableSlot, scatteringTable); batch.setResourceTexture(ScatteringTask_CurvatureMapSlot, curvatureFramebuffer->getRenderBuffer(0)); batch.setResourceTexture(ScatteringTask_DiffusedCurvatureMapSlot, diffusedFramebuffer->getRenderBuffer(0)); batch.setResourceTexture(ScatteringTask_NormalMapSlot, deferredFramebuffer->getDeferredNormalTexture()); batch.setResourceTexture(ScatteringTask_AlbedoMapSlot, deferredFramebuffer->getDeferredColorTexture()); batch.setResourceTexture(ScatteringTask_LinearMapSlot, linearDepthTexture); batch._glUniform2f(debugScatteringPipeline->getProgram()->getUniforms().findLocation("uniformCursorTexcoord"), _debugCursorTexcoord.x, _debugCursorTexcoord.y); batch.draw(gpu::TRIANGLE_STRIP, 4); } } if (_showSpecularTable) { batch.setViewportTransform(glm::ivec4(viewportSize + offsetViewport * 0.5, 0, viewportSize * 0.5, viewportSize * 0.5)); batch.setPipeline(getShowLUTPipeline()); batch.setResourceTexture(0, scatteringSpecular); batch.draw(gpu::TRIANGLE_STRIP, 4); } batch.setViewportTransform(args->_viewport); });