From 9e05403abaee0497a85231db753e1af0849fb7e8 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 15 Dec 2016 14:59:25 -0500 Subject: [PATCH] forward render opaque bounds --- .../render-utils/src/RenderForwardTask.cpp | 76 ++++++++++++++----- .../render-utils/src/RenderForwardTask.h | 16 +++- 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 9cd37a1ad6..0d032f1965 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -21,29 +21,14 @@ #include #include -#include -#include -#include -#include -#include "LightingModel.h" -#include "DebugDeferredBuffer.h" -#include "DeferredFramebuffer.h" -#include "DeferredLightingEffect.h" -#include "SurfaceGeometryPass.h" #include "FramebufferCache.h" -#include "HitEffect.h" #include "TextureCache.h" -#include "AmbientOcclusionEffect.h" -#include "AntialiasingEffect.h" -#include "ToneMappingEffect.h" -#include "SubsurfaceScattering.h" - #include -#include "drawOpaqueStencil_frag.h" - +#include +#include using namespace render; extern void initOverlay3DPipelines(render::ShapePlumber& plumber); @@ -95,6 +80,8 @@ RenderForwardTask::RenderForwardTask(CullFunctor cullFunctor) { const auto framebuffer = addJob("PrepareFramebuffer"); + addJob("DrawBounds", opaques); + // Blit! addJob("Blit", framebuffer); } @@ -153,8 +140,61 @@ void PrepareFramebuffer::run(const SceneContextPointer& sceneContext, const Rend gpu::Framebuffer::BUFFER_COLOR0 | gpu::Framebuffer::BUFFER_DEPTH | gpu::Framebuffer::BUFFER_STENCIL, - vec4(vec3(0), 0), 1.0, 0.0, true); + vec4(vec3(0), 1), 1.0, 0.0, true); }); framebuffer = _framebuffer; } + +const gpu::PipelinePointer DrawBounds::getPipeline() { + if (!_boundsPipeline) { + auto vs = gpu::Shader::createVertex(std::string(drawItemBounds_vert)); + auto ps = gpu::Shader::createPixel(std::string(drawItemBounds_frag)); + gpu::ShaderPointer program = gpu::Shader::createProgram(vs, ps); + + gpu::Shader::BindingSet slotBindings; + gpu::Shader::makeProgram(*program, slotBindings); + + _cornerLocation = program->getUniforms().findLocation("inBoundPos"); + _scaleLocation = program->getUniforms().findLocation("inBoundDim"); + + auto state = std::make_shared(); + state->setDepthTest(true, false, gpu::LESS_EQUAL); + state->setBlendFunction(true, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::DEST_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ZERO); + + _boundsPipeline = gpu::Pipeline::create(program, state); + } + return _boundsPipeline; +} + +void DrawBounds::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& items) { + RenderArgs* args = renderContext->args; + auto& scene = sceneContext->_scene; + + gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + // Setup projection + glm::mat4 projMat; + Transform viewMat; + args->getViewFrustum().evalProjectionMatrix(projMat); + args->getViewFrustum().evalViewTransform(viewMat); + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + batch.setModelTransform(Transform()); + + // Bind program + batch.setPipeline(getPipeline()); + assert(_cornerLocation >= 0); + assert(_scaleLocation >= 0); + + // Render bounds + for (const auto& item : items) { + batch._glUniform3fv(_cornerLocation, 1, (const float*)(&item.bound.getCorner())); + batch._glUniform3fv(_scaleLocation, 1, (const float*)(&item.bound.getScale())); + + static const int NUM_VERTICES_PER_CUBE = 24; + batch.draw(gpu::LINES, NUM_VERTICES_PER_CUBE, 0); + } + }); +} diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index 9c4634a8ee..a4839e18ec 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -39,4 +39,18 @@ private: gpu::FramebufferPointer _framebuffer; }; -#endif // hifi_RenderForwardTask_h +class DrawBounds { +public: + using Inputs = render::ItemBounds; + using JobModel = render::Job::ModelI; + + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& items); + +private: + const gpu::PipelinePointer getPipeline(); + gpu::PipelinePointer _boundsPipeline; + int _cornerLocation { -1 }; + int _scaleLocation { -1 }; +}; + +#endif // hifi_RenderForwardTask_h \ No newline at end of file