Introduce a simple state sort for drawing opaque items
Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 9 files). Show all
Unified · Split
| @@ -96,7 +96,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { · 95 unmodified lines | |||
| 96 | addJob<PrepareDeferred>("PrepareDeferred"); | 96 | addJob<PrepareDeferred>("PrepareDeferred"); |
| 97 | 97 | ||
| 98 | // Render opaque objects in DeferredBuffer | 98 | // Render opaque objects in DeferredBuffer |
| 99 | addJob<DrawDeferred>("DrawOpaqueDeferred", opaques, shapePlumber); | 99 | addJob<DrawStateSortDeferred>("DrawOpaqueDeferred", opaques, shapePlumber); |
| 100 | 100 | ||
| 101 | // Once opaque is all rendered create stencil background | 101 | // Once opaque is all rendered create stencil background |
| 102 | addJob<DrawStencilDeferred>("DrawOpaqueStencil"); | 102 | addJob<DrawStencilDeferred>("DrawOpaqueStencil"); |
| @@ -200,6 +200,38 @@ void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderCont · 97 unmodified lines | |||
| 200 | config->setNumDrawn((int)inItems.size()); | 200 | config->setNumDrawn((int)inItems.size()); |
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems) { | ||
| 204 | assert(renderContext->args); | ||
| 205 | assert(renderContext->args->_viewFrustum); | ||
| 206 | |||
| 207 | auto config = std::static_pointer_cast<Config>(renderContext->jobConfig); | ||
| 208 | |||
| 209 | RenderArgs* args = renderContext->args; | ||
| 210 | |||
| 211 | gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { | ||
| 212 | args->_batch = &batch; | ||
| 213 | batch.setViewportTransform(args->_viewport); | ||
| 214 | batch.setStateScissorRect(args->_viewport); | ||
| 215 | |||
| 216 | glm::mat4 projMat; | ||
| 217 | Transform viewMat; | ||
| 218 | args->_viewFrustum->evalProjectionMatrix(projMat); | ||
| 219 | args->_viewFrustum->evalViewTransform(viewMat); | ||
| 220 | |||
| 221 | batch.setProjectionTransform(projMat); | ||
| 222 | batch.setViewTransform(viewMat); | ||
| 223 | |||
| 224 | if (_stateSort) { | ||
| 225 | renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn); | ||
| 226 | } else { | ||
| 227 | renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn); | ||
| 228 | } | ||
| 229 | args->_batch = nullptr; | ||
| 230 | }); | ||
| 231 | |||
| 232 | config->setNumDrawn((int)inItems.size()); | ||
| 233 | } | ||
| 234 | |||
| 203 | DrawOverlay3D::DrawOverlay3D(bool opaque) : | 235 | DrawOverlay3D::DrawOverlay3D(bool opaque) : |
| 204 | _shapePlumber(std::make_shared<ShapePlumber>()), | 236 | _shapePlumber(std::make_shared<ShapePlumber>()), |
| 205 | _opaquePass(opaque) { | 237 | _opaquePass(opaque) { |