mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-04-20 17:51:19 -05:00
add render bins to improve rendering of transparent objects using framebuffer renderer
This commit is contained in:
@@ -51,6 +51,13 @@ class PowerScaledCoordinate;
|
||||
|
||||
class Renderable : public properties::PropertyOwner {
|
||||
public:
|
||||
enum class RenderBin : int {
|
||||
Background = 1,
|
||||
Opaque = 2,
|
||||
Transparent = 4,
|
||||
Overlay = 8
|
||||
};
|
||||
|
||||
static Renderable* createFromDictionary(const ghoul::Dictionary& dictionary);
|
||||
|
||||
// constructors & destructor
|
||||
@@ -72,6 +79,10 @@ public:
|
||||
virtual void postRender(const RenderData& data);
|
||||
virtual void update(const UpdateData& data);
|
||||
|
||||
RenderBin renderBin() const;
|
||||
void setRenderBin(RenderBin bin);
|
||||
bool matchesRenderBinMask(int binMask);
|
||||
|
||||
bool isVisible() const;
|
||||
|
||||
bool hasTimeInterval();
|
||||
@@ -89,6 +100,7 @@ protected:
|
||||
properties::BoolProperty _enabled;
|
||||
|
||||
private:
|
||||
RenderBin _renderBin;
|
||||
PowerScaledScalar boundingSphere_;
|
||||
std::string _startTime;
|
||||
std::string _endTime;
|
||||
|
||||
@@ -43,10 +43,12 @@ struct UpdateData {
|
||||
bool doPerformanceMeasurement;
|
||||
};
|
||||
|
||||
|
||||
struct RenderData {
|
||||
const Camera& camera;
|
||||
psc position;
|
||||
bool doPerformanceMeasurement;
|
||||
int renderBinMask;
|
||||
};
|
||||
|
||||
struct RaycasterTask {
|
||||
|
||||
@@ -124,6 +124,7 @@ bool RenderableTrail::initialize() {
|
||||
"${MODULE_BASE}/shaders/ephemeris_vs.glsl",
|
||||
"${MODULE_BASE}/shaders/ephemeris_fs.glsl");
|
||||
|
||||
setRenderBin(Renderable::RenderBin::Overlay);
|
||||
|
||||
if (!_programObject)
|
||||
return false;
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <openspace/engine/openspaceengine.h>
|
||||
#include <openspace/engine/wrapper/windowwrapper.h>
|
||||
#include <openspace/rendering/renderengine.h>
|
||||
#include <openspace/rendering/renderable.h>
|
||||
#include <openspace/rendering/volumeraycaster.h>
|
||||
#include <openspace/scene/scene.h>
|
||||
#include <openspace/util/camera.h>
|
||||
@@ -260,7 +261,12 @@ void ABufferRenderer::render(float blackoutFactor, bool doPerformanceMeasurement
|
||||
glBindImageTexture(1, _fragmentTexture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32UI);
|
||||
|
||||
// Render the scene to the fragment buffer. Collect renderer tasks (active raycasters)
|
||||
RenderData data{ *_camera, psc(), doPerformanceMeasurements };
|
||||
int renderBinMask = static_cast<int>(Renderable::RenderBin::Background) |
|
||||
static_cast<int>(Renderable::RenderBin::Opaque) |
|
||||
static_cast<int>(Renderable::RenderBin::Transparent) |
|
||||
static_cast<int>(Renderable::RenderBin::Overlay);
|
||||
|
||||
RenderData data{ *_camera, psc(), doPerformanceMeasurements, renderBinMask };
|
||||
RendererTasks tasks;
|
||||
_scene->render(data, tasks);
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <openspace/scene/scene.h>
|
||||
#include <openspace/util/camera.h>
|
||||
#include <openspace/engine/openspaceengine.h>
|
||||
#include <openspace/rendering/renderable.h>
|
||||
#include <openspace/rendering/volumeraycaster.h>
|
||||
#include <openspace/rendering/raycastermanager.h>
|
||||
|
||||
@@ -329,7 +330,7 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
RenderData data = { *_camera, psc(), doPerformanceMeasurements };
|
||||
RenderData data = { *_camera, psc(), doPerformanceMeasurements, 0 };
|
||||
RendererTasks tasks;
|
||||
|
||||
// Capture standard fbo
|
||||
@@ -339,7 +340,13 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
// bind new fbo A with color and depth buffer.
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Background);
|
||||
_scene->render(data, tasks);
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Opaque);
|
||||
_scene->render(data, tasks);
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Transparent);
|
||||
_scene->render(data, tasks);
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Overlay);
|
||||
_scene->render(data, tasks);
|
||||
|
||||
for (const RaycasterTask& raycasterTask : tasks.raycasterTasks) {
|
||||
|
||||
@@ -72,6 +72,7 @@ Renderable* Renderable::createFromDictionary(const ghoul::Dictionary& dictionary
|
||||
|
||||
Renderable::Renderable()
|
||||
: _enabled("enabled", "Is Enabled", true)
|
||||
, _renderBin(RenderBin::Opaque)
|
||||
, _startTime("")
|
||||
, _endTime("")
|
||||
, _targetBody("")
|
||||
@@ -83,6 +84,7 @@ Renderable::Renderable()
|
||||
|
||||
Renderable::Renderable(const ghoul::Dictionary& dictionary)
|
||||
: _enabled("enabled", "Is Enabled", true)
|
||||
, _renderBin(RenderBin::Opaque)
|
||||
, _startTime("")
|
||||
, _endTime("")
|
||||
, _targetBody("")
|
||||
@@ -148,6 +150,18 @@ void Renderable::setPscUniforms(
|
||||
program.setUniform("scaling", camera.scaling());
|
||||
}
|
||||
|
||||
Renderable::RenderBin Renderable::renderBin() const {
|
||||
return _renderBin;
|
||||
}
|
||||
|
||||
void Renderable::setRenderBin(RenderBin bin) {
|
||||
_renderBin = bin;
|
||||
}
|
||||
|
||||
bool Renderable::matchesRenderBinMask(int binMask) {
|
||||
return binMask & static_cast<int>(renderBin());
|
||||
}
|
||||
|
||||
bool Renderable::isVisible() const {
|
||||
return _enabled;
|
||||
}
|
||||
|
||||
@@ -248,7 +248,14 @@ void SceneGraphNode::render(const RenderData& data, RendererTasks& tasks) {
|
||||
RenderData newData = {data.camera, thisPosition, data.doPerformanceMeasurement};
|
||||
|
||||
_performanceRecord.renderTime = 0;
|
||||
if (_renderableVisible && _renderable->isVisible() && _renderable->isReady() && _renderable->isEnabled()) {
|
||||
|
||||
bool visible = _renderableVisible &&
|
||||
_renderable->isVisible() &&
|
||||
_renderable->isReady() &&
|
||||
_renderable->isEnabled() &&
|
||||
_renderable->matchesRenderBinMask(data.renderBinMask);
|
||||
|
||||
if (visible) {
|
||||
if (data.doPerformanceMeasurement) {
|
||||
glFinish();
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
|
||||
Reference in New Issue
Block a user