mirror of
https://github.com/overte-org/overte.git
synced 2025-04-25 23:36:41 +02:00
Merge pull request #6556 from Atlante45/graphics
First pass at live g-buffer debugging.
This commit is contained in:
commit
6e372e46a4
13 changed files with 189 additions and 21 deletions
|
@ -66,6 +66,12 @@ var overlaysCounter = new CounterWidget(panel, "Overlays",
|
||||||
var showDisplayStatusFlag = 1;
|
var showDisplayStatusFlag = 1;
|
||||||
var showNetworkStatusFlag = 2;
|
var showNetworkStatusFlag = 2;
|
||||||
|
|
||||||
|
panel.newCheckbox("Debug deferred buffer",
|
||||||
|
function(value) { Scene.setEngineDisplayDebugDeferredBuffer(value > 0); },
|
||||||
|
function() { return Scene.doEngineDisplayDebugDeferredBuffer() > 0; },
|
||||||
|
function(value) { return value > 0; }
|
||||||
|
);
|
||||||
|
|
||||||
panel.newCheckbox("Display status",
|
panel.newCheckbox("Display status",
|
||||||
function(value) { Scene.setEngineDisplayItemStatus(value ?
|
function(value) { Scene.setEngineDisplayItemStatus(value ?
|
||||||
Scene.doEngineDisplayItemStatus() | showDisplayStatusFlag :
|
Scene.doEngineDisplayItemStatus() | showDisplayStatusFlag :
|
||||||
|
|
|
@ -3621,7 +3621,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
|
||||||
renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems();
|
renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems();
|
||||||
renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems();
|
renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems();
|
||||||
renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems();
|
renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems();
|
||||||
|
|
||||||
|
renderContext._drawDebugDeferredBuffer = sceneInterface->doEngineDisplayDebugDeferredBuffer();
|
||||||
|
|
||||||
renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus();
|
renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus();
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) {
|
||||||
renderContext._drawItemStatus |= render::showNetworkStatusFlag;
|
renderContext._drawItemStatus |= render::showNetworkStatusFlag;
|
||||||
|
|
70
libraries/render-utils/src/DebugDeferredBuffer.cpp
Normal file
70
libraries/render-utils/src/DebugDeferredBuffer.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
//
|
||||||
|
// DebugDeferredBuffer.cpp
|
||||||
|
// libraries/render-utils/src
|
||||||
|
//
|
||||||
|
// Created by Clement on 12/3/15.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "DebugDeferredBuffer.h"
|
||||||
|
|
||||||
|
#include <gpu/Batch.h>
|
||||||
|
#include <gpu/Context.h>
|
||||||
|
#include <render/Scene.h>
|
||||||
|
#include <ViewFrustum.h>
|
||||||
|
|
||||||
|
#include "GeometryCache.h"
|
||||||
|
#include "FramebufferCache.h"
|
||||||
|
|
||||||
|
#include "debug_deferred_buffer_vert.h"
|
||||||
|
#include "debug_deferred_buffer_frag.h"
|
||||||
|
|
||||||
|
using namespace render;
|
||||||
|
|
||||||
|
const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline() {
|
||||||
|
if (!_pipeline) {
|
||||||
|
auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert }));
|
||||||
|
auto ps = gpu::ShaderPointer(gpu::Shader::createPixel({ debug_deferred_buffer_frag }));
|
||||||
|
auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps));
|
||||||
|
|
||||||
|
|
||||||
|
gpu::Shader::BindingSet slotBindings;
|
||||||
|
gpu::Shader::makeProgram(*program, slotBindings);
|
||||||
|
|
||||||
|
// Good to go add the brand new pipeline
|
||||||
|
_pipeline.reset(gpu::Pipeline::create(program, std::make_shared<gpu::State>()));
|
||||||
|
}
|
||||||
|
return _pipeline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
|
||||||
|
assert(renderContext->args);
|
||||||
|
assert(renderContext->args->_viewFrustum);
|
||||||
|
RenderArgs* args = renderContext->args;
|
||||||
|
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
|
||||||
|
auto geometryBuffer = DependencyManager::get<GeometryCache>();
|
||||||
|
auto framebufferCache = DependencyManager::get<FramebufferCache>();
|
||||||
|
|
||||||
|
|
||||||
|
glm::mat4 projMat;
|
||||||
|
Transform viewMat;
|
||||||
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
|
batch.setProjectionTransform(projMat);
|
||||||
|
batch.setViewTransform(viewMat);
|
||||||
|
batch.setModelTransform(Transform());
|
||||||
|
|
||||||
|
batch.setPipeline(getPipeline());
|
||||||
|
|
||||||
|
batch.setResourceTexture(0, framebufferCache->getDeferredColorTexture());
|
||||||
|
|
||||||
|
glm::vec4 color(0.0f, 0.0f, 1.0f, 1.0f);
|
||||||
|
glm::vec2 bottomLeft(0.0f, -1.0f);
|
||||||
|
glm::vec2 topRight(1.0f, 1.0f);
|
||||||
|
geometryBuffer->renderQuad(batch, bottomLeft, topRight, color);
|
||||||
|
});
|
||||||
|
}
|
29
libraries/render-utils/src/DebugDeferredBuffer.h
Normal file
29
libraries/render-utils/src/DebugDeferredBuffer.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
//
|
||||||
|
// DebugDeferredBuffer.h
|
||||||
|
// libraries/render-utils/src
|
||||||
|
//
|
||||||
|
// Created by Clement on 12/3/15.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef hifi_DebugDeferredBuffer_h
|
||||||
|
#define hifi_DebugDeferredBuffer_h
|
||||||
|
|
||||||
|
#include <render/DrawTask.h>
|
||||||
|
|
||||||
|
class DebugDeferredBuffer {
|
||||||
|
public:
|
||||||
|
using JobModel = render::Job::Model<DebugDeferredBuffer>;
|
||||||
|
|
||||||
|
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const gpu::PipelinePointer& getPipeline();
|
||||||
|
|
||||||
|
gpu::PipelinePointer _pipeline;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_DebugDeferredBuffer_h
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include <glm/gtc/random.hpp>
|
#include <glm/gtc/random.hpp>
|
||||||
|
|
||||||
|
#include <DependencyManager.h>
|
||||||
#include <PathUtils.h>
|
#include <PathUtils.h>
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,7 @@
|
||||||
#ifndef hifi_hitEffect_h
|
#ifndef hifi_hitEffect_h
|
||||||
#define hifi_hitEffect_h
|
#define hifi_hitEffect_h
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#include <render/DrawTask.h>
|
||||||
#include "render/DrawTask.h"
|
|
||||||
|
|
||||||
class AbstractViewStateInterface;
|
|
||||||
class ProgramObject;
|
|
||||||
|
|
||||||
class HitEffect {
|
class HitEffect {
|
||||||
public:
|
public:
|
||||||
|
@ -23,7 +19,7 @@ public:
|
||||||
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
|
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
|
||||||
typedef render::Job::Model<HitEffect> JobModel;
|
typedef render::Job::Model<HitEffect> JobModel;
|
||||||
|
|
||||||
const gpu::PipelinePointer& getHitEffectPipeline();
|
const gpu::PipelinePointer& getHitEffectPipeline();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
gpu::PipelinePointer _hitEffectPipeline;
|
gpu::PipelinePointer _hitEffectPipeline;
|
||||||
|
|
|
@ -18,10 +18,11 @@
|
||||||
#include <gpu/Context.h>
|
#include <gpu/Context.h>
|
||||||
#include <gpu/StandardShaderLib.h>
|
#include <gpu/StandardShaderLib.h>
|
||||||
|
|
||||||
#include "FramebufferCache.h"
|
#include "DebugDeferredBuffer.h"
|
||||||
#include "DeferredLightingEffect.h"
|
#include "DeferredLightingEffect.h"
|
||||||
#include "TextureCache.h"
|
#include "FramebufferCache.h"
|
||||||
#include "HitEffect.h"
|
#include "HitEffect.h"
|
||||||
|
#include "TextureCache.h"
|
||||||
|
|
||||||
#include "render/DrawStatus.h"
|
#include "render/DrawStatus.h"
|
||||||
#include "AmbientOcclusionEffect.h"
|
#include "AmbientOcclusionEffect.h"
|
||||||
|
@ -112,6 +113,10 @@ RenderDeferredTask::RenderDeferredTask() : Task() {
|
||||||
_jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false))));
|
_jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false))));
|
||||||
_jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput())));
|
_jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput())));
|
||||||
|
|
||||||
|
_jobs.push_back(Job(new DebugDeferredBuffer::JobModel("DebugDeferredBuffer")));
|
||||||
|
_jobs.back().setEnabled(false);
|
||||||
|
_drawDebugDeferredBufferIndex = _jobs.size() - 1;
|
||||||
|
|
||||||
// Grab a texture map representing the different status icons and assign that to the drawStatsuJob
|
// Grab a texture map representing the different status icons and assign that to the drawStatsuJob
|
||||||
auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg";
|
auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg";
|
||||||
|
|
||||||
|
@ -151,10 +156,13 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure we turn the deferred buffer debug on/off
|
||||||
|
setDrawDebugDeferredBuffer(renderContext->_drawDebugDeferredBuffer);
|
||||||
|
|
||||||
// Make sure we turn the displayItemStatus on/off
|
// Make sure we turn the displayItemStatus on/off
|
||||||
setDrawItemStatus(renderContext->_drawItemStatus);
|
setDrawItemStatus(renderContext->_drawItemStatus);
|
||||||
|
|
||||||
//Make sure we display hit effect on screen, as desired from a script
|
// Make sure we display hit effect on screen, as desired from a script
|
||||||
setDrawHitEffect(renderContext->_drawHitEffect);
|
setDrawHitEffect(renderContext->_drawHitEffect);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -80,9 +80,9 @@ class DrawOverlay3D {
|
||||||
static gpu::PipelinePointer _opaquePipeline; //lazy evaluation hence mutable
|
static gpu::PipelinePointer _opaquePipeline; //lazy evaluation hence mutable
|
||||||
public:
|
public:
|
||||||
static const gpu::PipelinePointer& getOpaquePipeline();
|
static const gpu::PipelinePointer& getOpaquePipeline();
|
||||||
|
|
||||||
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
|
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
|
||||||
|
|
||||||
typedef render::Job::Model<DrawOverlay3D> JobModel;
|
typedef render::Job::Model<DrawOverlay3D> JobModel;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -93,16 +93,23 @@ public:
|
||||||
~RenderDeferredTask();
|
~RenderDeferredTask();
|
||||||
|
|
||||||
render::Jobs _jobs;
|
render::Jobs _jobs;
|
||||||
|
|
||||||
|
int _drawDebugDeferredBufferIndex = -1;
|
||||||
int _drawStatusJobIndex = -1;
|
int _drawStatusJobIndex = -1;
|
||||||
int _drawHitEffectJobIndex = -1;
|
int _drawHitEffectJobIndex = -1;
|
||||||
|
|
||||||
|
void setDrawDebugDeferredBuffer(int draw) {
|
||||||
|
if (_drawDebugDeferredBufferIndex >= 0) {
|
||||||
|
_jobs[_drawDebugDeferredBufferIndex].setEnabled(draw > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool doDrawDebugDeferredBuffer() const { if (_drawDebugDeferredBufferIndex >= 0) { return _jobs[_drawDebugDeferredBufferIndex].isEnabled(); } else { return false; } }
|
||||||
|
|
||||||
void setDrawItemStatus(int draw) {
|
void setDrawItemStatus(int draw) {
|
||||||
if (_drawStatusJobIndex >= 0) {
|
if (_drawStatusJobIndex >= 0) {
|
||||||
_jobs[_drawStatusJobIndex].setEnabled(draw > 0);
|
_jobs[_drawStatusJobIndex].setEnabled(draw > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } }
|
bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } }
|
||||||
|
|
||||||
void setDrawHitEffect(bool draw) { if (_drawHitEffectJobIndex >= 0) { _jobs[_drawHitEffectJobIndex].setEnabled(draw); } }
|
void setDrawHitEffect(bool draw) { if (_drawHitEffectJobIndex >= 0) { _jobs[_drawHitEffectJobIndex].setEnabled(draw); } }
|
||||||
|
|
22
libraries/render-utils/src/debug_deferred_buffer.slf
Normal file
22
libraries/render-utils/src/debug_deferred_buffer.slf
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<@include gpu/Config.slh@>
|
||||||
|
<$VERSION_HEADER$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
|
//
|
||||||
|
// debug_deferred_buffer.slf
|
||||||
|
// fragment shader
|
||||||
|
//
|
||||||
|
// Created by Clement on 12/3
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
<@include DeferredBuffer.slh@>
|
||||||
|
|
||||||
|
in vec2 uv;
|
||||||
|
out vec4 outFragColor;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
outFragColor = texture(diffuseMap, uv);
|
||||||
|
}
|
22
libraries/render-utils/src/debug_deferred_buffer.slv
Normal file
22
libraries/render-utils/src/debug_deferred_buffer.slv
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<@include gpu/Config.slh@>
|
||||||
|
<$VERSION_HEADER$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
|
//
|
||||||
|
// debug_deferred_buffer.slv
|
||||||
|
// vertex shader
|
||||||
|
//
|
||||||
|
// Created by Clement on 12/3
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
<@include gpu/Inputs.slh@>
|
||||||
|
|
||||||
|
out vec2 uv;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
uv = (inPosition.xy + 1.0) * 0.5;
|
||||||
|
gl_Position = inPosition;
|
||||||
|
}
|
|
@ -20,8 +20,8 @@ in vec2 varQuadPosition;
|
||||||
out vec4 outFragColor;
|
out vec4 outFragColor;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
vec2 center = vec2(0.0, 0.0);
|
vec2 center = vec2(0.0, 0.0);
|
||||||
float distFromCenter = distance( vec2(0.0, 0.0), varQuadPosition);
|
float distFromCenter = distance( vec2(0.0, 0.0), varQuadPosition);
|
||||||
float alpha = mix(0.0, 0.5, pow(distFromCenter,5.));
|
float alpha = mix(0.0, 0.5, pow(distFromCenter,5.));
|
||||||
outFragColor = vec4(1.0, 0.0, 0.0, alpha);
|
outFragColor = vec4(1.0, 0.0, 0.0, alpha);
|
||||||
}
|
}
|
|
@ -53,6 +53,7 @@ public:
|
||||||
int _numDrawnOverlay3DItems = 0;
|
int _numDrawnOverlay3DItems = 0;
|
||||||
int _maxDrawnOverlay3DItems = -1;
|
int _maxDrawnOverlay3DItems = -1;
|
||||||
|
|
||||||
|
int _drawDebugDeferredBuffer = 0;
|
||||||
int _drawItemStatus = 0;
|
int _drawItemStatus = 0;
|
||||||
bool _drawHitEffect = false;
|
bool _drawHitEffect = false;
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,10 @@ public:
|
||||||
Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; }
|
Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; }
|
||||||
Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; }
|
Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; }
|
||||||
Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; }
|
Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; }
|
||||||
|
|
||||||
|
Q_INVOKABLE void setEngineDisplayDebugDeferredBuffer(int display) { _drawDebugDeferredBuffer = display; }
|
||||||
|
Q_INVOKABLE int doEngineDisplayDebugDeferredBuffer() { return _drawDebugDeferredBuffer; }
|
||||||
|
|
||||||
Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; }
|
Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; }
|
||||||
Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; }
|
Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; }
|
||||||
|
|
||||||
|
@ -142,7 +145,8 @@ protected:
|
||||||
int _maxDrawnOpaqueItems = -1;
|
int _maxDrawnOpaqueItems = -1;
|
||||||
int _maxDrawnTransparentItems = -1;
|
int _maxDrawnTransparentItems = -1;
|
||||||
int _maxDrawnOverlay3DItems = -1;
|
int _maxDrawnOverlay3DItems = -1;
|
||||||
|
|
||||||
|
int _drawDebugDeferredBuffer = 0;
|
||||||
int _drawItemStatus = 0;
|
int _drawItemStatus = 0;
|
||||||
|
|
||||||
bool _drawHitEffect = false;
|
bool _drawHitEffect = false;
|
||||||
|
|
Loading…
Reference in a new issue