mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 11:48:09 +02:00
added tone mapping back
This commit is contained in:
parent
0d2b2a2aef
commit
6a6b2f6d27
11 changed files with 136 additions and 434 deletions
|
@ -41,7 +41,7 @@
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "Snapshot.h"
|
#include "Snapshot.h"
|
||||||
#include "SnapshotUploader.h"
|
#include "SnapshotUploader.h"
|
||||||
#include "ToneMappingEffect.h"
|
#include "ToneMapAndResampleTask.h"
|
||||||
|
|
||||||
// filename format: hifi-snap-by-%username%-on-%date%_%time%_@-%location%.jpg
|
// filename format: hifi-snap-by-%username%-on-%date%_%time%_@-%location%.jpg
|
||||||
// %1 <= username, %2 <= date and time, %3 <= current location
|
// %1 <= username, %2 <= date and time, %3 <= current location
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <shaders/Shaders.h>
|
#include <shaders/Shaders.h>
|
||||||
|
|
||||||
#include <render/BlurTask.h>
|
#include <render/BlurTask.h>
|
||||||
#include <render/ToneMapAndResampleTask.h>
|
#include "ToneMapAndResampleTask.h"
|
||||||
#include "render-utils/ShaderConstants.h"
|
#include "render-utils/ShaderConstants.h"
|
||||||
|
|
||||||
#define BLOOM_BLUR_LEVEL_COUNT 3
|
#define BLOOM_BLUR_LEVEL_COUNT 3
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include <render/DrawStatus.h>
|
#include <render/DrawStatus.h>
|
||||||
#include <render/DrawSceneOctree.h>
|
#include <render/DrawSceneOctree.h>
|
||||||
#include <render/BlurTask.h>
|
#include <render/BlurTask.h>
|
||||||
#include <render/ToneMapAndResampleTask.h>
|
|
||||||
|
|
||||||
#include "RenderHifi.h"
|
#include "RenderHifi.h"
|
||||||
#include "render-utils/ShaderConstants.h"
|
#include "render-utils/ShaderConstants.h"
|
||||||
|
@ -51,7 +50,7 @@
|
||||||
|
|
||||||
#include "AmbientOcclusionEffect.h"
|
#include "AmbientOcclusionEffect.h"
|
||||||
#include "AntialiasingEffect.h"
|
#include "AntialiasingEffect.h"
|
||||||
#include "ToneMappingEffect.h"
|
#include "ToneMapAndResampleTask.h"
|
||||||
#include "SubsurfaceScattering.h"
|
#include "SubsurfaceScattering.h"
|
||||||
#include "DrawHaze.h"
|
#include "DrawHaze.h"
|
||||||
#include "BloomEffect.h"
|
#include "BloomEffect.h"
|
||||||
|
@ -239,8 +238,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren
|
||||||
task.addJob<BloomEffect>("Bloom", bloomInputs);
|
task.addJob<BloomEffect>("Bloom", bloomInputs);
|
||||||
|
|
||||||
// Lighting Buffer ready for tone mapping
|
// Lighting Buffer ready for tone mapping
|
||||||
const auto toneMappingInputs = ToneMappingDeferred::Input(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying();
|
//TODO re-enable last 3 steps
|
||||||
const auto toneMappedBuffer = task.addJob<ToneMappingDeferred>("ToneMapping", toneMappingInputs);
|
//const auto toneMappingInputs = ToneMappingDeferred::Input(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying();
|
||||||
|
//const auto toneMappedBuffer = task.addJob<ToneMappingDeferred>("ToneMapping", toneMappingInputs);
|
||||||
|
|
||||||
// Debugging task is happening in the "over" layer after tone mapping and just before HUD
|
// Debugging task is happening in the "over" layer after tone mapping and just before HUD
|
||||||
{ // Debug the bounds of the rendered items, still look at the zbuffer
|
{ // Debug the bounds of the rendered items, still look at the zbuffer
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <graphics/ShaderConstants.h>
|
#include <graphics/ShaderConstants.h>
|
||||||
#include <render/ShapePipeline.h>
|
#include <render/ShapePipeline.h>
|
||||||
//#include <render/ResampleTask.h>
|
//#include <render/ResampleTask.h>
|
||||||
#include <render/ToneMapAndResampleTask.h>
|
//#include <ToneMapAndResampleTask.h>
|
||||||
|
|
||||||
#include <render/FilterTask.h>
|
#include <render/FilterTask.h>
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@
|
||||||
#include "StencilMaskPass.h"
|
#include "StencilMaskPass.h"
|
||||||
#include "ZoneRenderer.h"
|
#include "ZoneRenderer.h"
|
||||||
#include "FadeEffect.h"
|
#include "FadeEffect.h"
|
||||||
#include "ToneMappingEffect.h"
|
//#include "ToneMappingEffect.h"
|
||||||
//#include "ToneMapAndResampleTask.h"
|
#include "ToneMapAndResampleTask.h"
|
||||||
#include "BackgroundStage.h"
|
#include "BackgroundStage.h"
|
||||||
#include "FramebufferCache.h"
|
#include "FramebufferCache.h"
|
||||||
#include "TextureCache.h"
|
#include "TextureCache.h"
|
||||||
|
@ -167,8 +167,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Upscale to finale resolution
|
// Upscale to finale resolution
|
||||||
//const auto primaryFramebuffer = task.addJob<ToneMapAndResample>("ToneMapAndResample", toneMappedBuffer);
|
const auto primaryFramebuffer = task.addJob<ToneMapAndResample>("ToneMapAndResample", toneMappedBuffer);
|
||||||
const auto primaryFramebuffer = task.addJob<render::ToneMapAndResample>("ToneMapAndResample", toneMappedBuffer);
|
|
||||||
|
|
||||||
// HUD Layer
|
// HUD Layer
|
||||||
const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying();
|
const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying();
|
||||||
|
|
109
libraries/render-utils/src/ToneMapAndResampleTask.cpp
Normal file
109
libraries/render-utils/src/ToneMapAndResampleTask.cpp
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
//
|
||||||
|
// ResampleTask.cpp
|
||||||
|
// render/src/render
|
||||||
|
//
|
||||||
|
// Various to Resample or downsample textures into framebuffers.
|
||||||
|
//
|
||||||
|
// Created by Olivier Prat on 10/09/17.
|
||||||
|
// Copyright 2017 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 "ToneMapAndResampleTask.h"
|
||||||
|
|
||||||
|
#include <gpu/Context.h>
|
||||||
|
#include <shaders/Shaders.h>
|
||||||
|
|
||||||
|
#include "render-utils/ShaderConstants.h"
|
||||||
|
#include "StencilMaskPass.h"
|
||||||
|
#include "FramebufferCache.h"
|
||||||
|
|
||||||
|
using namespace render;
|
||||||
|
using namespace shader::gpu::program;
|
||||||
|
using namespace shader::render_utils::program;
|
||||||
|
|
||||||
|
ToneMapAndResample::ToneMapAndResample() {
|
||||||
|
Parameters parameters;
|
||||||
|
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) ¶meters));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToneMapAndResample::setExposure(float exposure) {
|
||||||
|
auto& params = _parametersBuffer.get<Parameters>();
|
||||||
|
if (params._exposure != exposure) {
|
||||||
|
_parametersBuffer.edit<Parameters>()._exposure = exposure;
|
||||||
|
_parametersBuffer.edit<Parameters>()._twoPowExposure = pow(2.0, exposure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToneMapAndResample::setToneCurve(ToneCurve curve) {
|
||||||
|
auto& params = _parametersBuffer.get<Parameters>();
|
||||||
|
if (params._toneCurve != (int)curve) {
|
||||||
|
_parametersBuffer.edit<Parameters>()._toneCurve = (int)curve;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToneMapAndResample::configure(const Config& config) {
|
||||||
|
setExposure(config.exposure);
|
||||||
|
setToneCurve((ToneCurve)config.curve);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::PipelinePointer ToneMapAndResample::_pipeline;
|
||||||
|
gpu::PipelinePointer ToneMapAndResample::_mirrorPipeline;
|
||||||
|
|
||||||
|
void ToneMapAndResample::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) {
|
||||||
|
assert(renderContext->args);
|
||||||
|
assert(renderContext->args->hasViewFrustum());
|
||||||
|
RenderArgs* args = renderContext->args;
|
||||||
|
auto sourceFramebuffer = input;
|
||||||
|
|
||||||
|
//auto lightingBuffer = input->getRenderBuffer(0);
|
||||||
|
|
||||||
|
resampledFrameBuffer = args->_blitFramebuffer;
|
||||||
|
/*
|
||||||
|
if (!_pipeline) {
|
||||||
|
init(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lightingBuffer || !blitFramebuffer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (resampledFrameBuffer != sourceFramebuffer) {
|
||||||
|
|
||||||
|
if (!_pipeline) {
|
||||||
|
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
||||||
|
|
||||||
|
state->setDepthTest(gpu::State::DepthTest(false, false));
|
||||||
|
//blitState->setColorWriteMask(true, true, true, true);
|
||||||
|
|
||||||
|
_pipeline = gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), state);
|
||||||
|
_mirrorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), state);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto bufferSize = resampledFrameBuffer->getSize();
|
||||||
|
|
||||||
|
//auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions());
|
||||||
|
|
||||||
|
glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y };
|
||||||
|
|
||||||
|
gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) {
|
||||||
|
batch.enableStereo(false);
|
||||||
|
batch.setFramebuffer(resampledFrameBuffer);
|
||||||
|
|
||||||
|
batch.setViewportTransform(viewport);
|
||||||
|
batch.setProjectionTransform(glm::mat4());
|
||||||
|
batch.resetViewTransform();
|
||||||
|
batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline);
|
||||||
|
|
||||||
|
// viewport = args->_viewport ??
|
||||||
|
batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport));
|
||||||
|
batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0));
|
||||||
|
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set full final viewport
|
||||||
|
args->_viewport = viewport;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,13 +14,18 @@
|
||||||
#ifndef hifi_render_ToneMapAndResampleTask_h
|
#ifndef hifi_render_ToneMapAndResampleTask_h
|
||||||
#define hifi_render_ToneMapAndResampleTask_h
|
#define hifi_render_ToneMapAndResampleTask_h
|
||||||
|
|
||||||
#include "Engine.h"
|
#include "render/Engine.h"
|
||||||
|
|
||||||
namespace render {
|
#include <DependencyManager.h>
|
||||||
|
#include <NumericalConstants.h>
|
||||||
|
#include <render/Forward.h>
|
||||||
|
#include <render/DrawTask.h>
|
||||||
|
|
||||||
|
//namespace render {
|
||||||
|
|
||||||
enum class ToneCurve {
|
enum class ToneCurve {
|
||||||
// Different tone curve available
|
// Different tone curve available
|
||||||
None,
|
None,
|
||||||
Gamma22,
|
Gamma22,
|
||||||
Reinhard,
|
Reinhard,
|
||||||
Filmic,
|
Filmic,
|
||||||
|
@ -110,10 +115,10 @@ namespace render {
|
||||||
using Output = gpu::FramebufferPointer;
|
using Output = gpu::FramebufferPointer;
|
||||||
using Config = ToneMappingConfig;
|
using Config = ToneMappingConfig;
|
||||||
//using JobModel = render::Job::ModelIO<ToneMapAndResample, Input, Output, Config>;
|
//using JobModel = render::Job::ModelIO<ToneMapAndResample, Input, Output, Config>;
|
||||||
using JobModel = Job::ModelIO<ToneMapAndResample, Input, gpu::FramebufferPointer, Config>;
|
using JobModel = render::Job::ModelIO<ToneMapAndResample, Input, gpu::FramebufferPointer, Config>;
|
||||||
|
|
||||||
void configure(const Config& config);
|
void configure(const Config& config);
|
||||||
void run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer);
|
void run(const render::RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -146,6 +151,6 @@ namespace render {
|
||||||
|
|
||||||
void init(RenderArgs* args);
|
void init(RenderArgs* args);
|
||||||
};
|
};
|
||||||
}
|
//}
|
||||||
|
|
||||||
#endif // hifi_render_ResampleTask_h
|
#endif // hifi_render_ResampleTask_h
|
|
@ -1,96 +0,0 @@
|
||||||
//
|
|
||||||
// ToneMappingEffect.cpp
|
|
||||||
// libraries/render-utils/src
|
|
||||||
//
|
|
||||||
// Created by Sam Gateau on 12/7/2015.
|
|
||||||
// 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 "ToneMappingEffect.h"
|
|
||||||
|
|
||||||
#include <gpu/Context.h>
|
|
||||||
#include <shaders/Shaders.h>
|
|
||||||
|
|
||||||
#include "render-utils/ShaderConstants.h"
|
|
||||||
#include "StencilMaskPass.h"
|
|
||||||
#include "FramebufferCache.h"
|
|
||||||
|
|
||||||
|
|
||||||
ToneMappingEffect::ToneMappingEffect() {
|
|
||||||
Parameters parameters;
|
|
||||||
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) ¶meters));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMappingEffect::init(RenderArgs* args) {
|
|
||||||
auto blitProgram = gpu::Shader::createProgram(shader::render_utils::program::toneMapping);
|
|
||||||
|
|
||||||
auto blitState = std::make_shared<gpu::State>();
|
|
||||||
blitState->setColorWriteMask(true, true, true, true);
|
|
||||||
_blitLightBuffer = gpu::PipelinePointer(gpu::Pipeline::create(blitProgram, blitState));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMappingEffect::setExposure(float exposure) {
|
|
||||||
auto& params = _parametersBuffer.get<Parameters>();
|
|
||||||
if (params._exposure != exposure) {
|
|
||||||
_parametersBuffer.edit<Parameters>()._exposure = exposure;
|
|
||||||
_parametersBuffer.edit<Parameters>()._twoPowExposure = pow(2.0, exposure);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMappingEffect::setToneCurve(ToneCurve curve) {
|
|
||||||
auto& params = _parametersBuffer.get<Parameters>();
|
|
||||||
if (params._toneCurve != curve) {
|
|
||||||
_parametersBuffer.edit<Parameters>()._toneCurve = curve;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& destinationFramebuffer) {
|
|
||||||
if (!_blitLightBuffer) {
|
|
||||||
init(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lightingBuffer || !destinationFramebuffer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto framebufferSize = glm::ivec2(lightingBuffer->getDimensions());
|
|
||||||
gpu::doInBatch("ToneMappingEffect::render", args->_context, [&](gpu::Batch& batch) {
|
|
||||||
batch.enableStereo(false);
|
|
||||||
batch.setFramebuffer(destinationFramebuffer);
|
|
||||||
|
|
||||||
// FIXME: Generate the Luminosity map
|
|
||||||
//batch.generateTextureMips(lightingBuffer);
|
|
||||||
|
|
||||||
batch.setViewportTransform(args->_viewport);
|
|
||||||
batch.setProjectionTransform(glm::mat4());
|
|
||||||
batch.resetViewTransform();
|
|
||||||
batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(framebufferSize, args->_viewport));
|
|
||||||
batch.setPipeline(_blitLightBuffer);
|
|
||||||
|
|
||||||
batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer);
|
|
||||||
batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer);
|
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ToneMappingDeferred::configure(const Config& config) {
|
|
||||||
_toneMappingEffect.setExposure(config.exposure);
|
|
||||||
_toneMappingEffect.setToneCurve((ToneMappingEffect::ToneCurve)config.curve);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMappingDeferred::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) {
|
|
||||||
|
|
||||||
auto lightingBuffer = input.get0()->getRenderBuffer(0);
|
|
||||||
auto destFbo = input.get1();
|
|
||||||
|
|
||||||
if (!destFbo) {
|
|
||||||
destFbo = renderContext->args->_blitFramebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
_toneMappingEffect.render(renderContext->args, lightingBuffer, destFbo);
|
|
||||||
output = destFbo;
|
|
||||||
}
|
|
|
@ -1,96 +0,0 @@
|
||||||
//
|
|
||||||
// ToneMappingEffect.h
|
|
||||||
// libraries/render-utils/src
|
|
||||||
//
|
|
||||||
// Created by Sam Gateau on 12/7/2015.
|
|
||||||
// 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_ToneMappingEffect_h
|
|
||||||
#define hifi_ToneMappingEffect_h
|
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
|
||||||
#include <NumericalConstants.h>
|
|
||||||
|
|
||||||
#include <gpu/Resource.h>
|
|
||||||
#include <gpu/Pipeline.h>
|
|
||||||
#include <render/Forward.h>
|
|
||||||
#include <render/DrawTask.h>
|
|
||||||
|
|
||||||
|
|
||||||
class ToneMappingEffect {
|
|
||||||
public:
|
|
||||||
ToneMappingEffect();
|
|
||||||
virtual ~ToneMappingEffect() {}
|
|
||||||
|
|
||||||
void render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& destinationBuffer);
|
|
||||||
|
|
||||||
void setExposure(float exposure);
|
|
||||||
float getExposure() const { return _parametersBuffer.get<Parameters>()._exposure; }
|
|
||||||
|
|
||||||
// Different tone curve available
|
|
||||||
enum ToneCurve {
|
|
||||||
None = 0,
|
|
||||||
Gamma22,
|
|
||||||
Reinhard,
|
|
||||||
Filmic,
|
|
||||||
};
|
|
||||||
void setToneCurve(ToneCurve curve);
|
|
||||||
ToneCurve getToneCurve() const { return (ToneCurve)_parametersBuffer.get<Parameters>()._toneCurve; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
gpu::PipelinePointer _blitLightBuffer;
|
|
||||||
|
|
||||||
// Class describing the uniform buffer with all the parameters common to the tone mapping shaders
|
|
||||||
class Parameters {
|
|
||||||
public:
|
|
||||||
float _exposure = 0.0f;
|
|
||||||
float _twoPowExposure = 1.0f;
|
|
||||||
glm::vec2 spareA;
|
|
||||||
int _toneCurve = Gamma22;
|
|
||||||
glm::vec3 spareB;
|
|
||||||
|
|
||||||
Parameters() {}
|
|
||||||
};
|
|
||||||
typedef gpu::BufferView UniformBufferView;
|
|
||||||
gpu::BufferView _parametersBuffer;
|
|
||||||
|
|
||||||
void init(RenderArgs* args);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ToneMappingConfig : public render::Job::Config {
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(float exposure MEMBER exposure WRITE setExposure);
|
|
||||||
Q_PROPERTY(int curve MEMBER curve WRITE setCurve);
|
|
||||||
public:
|
|
||||||
ToneMappingConfig() : render::Job::Config(true) {}
|
|
||||||
|
|
||||||
void setExposure(float newExposure) { exposure = newExposure; emit dirty(); }
|
|
||||||
void setCurve(int newCurve) { curve = std::max((int)ToneMappingEffect::None, std::min((int)ToneMappingEffect::Filmic, newCurve)); emit dirty(); }
|
|
||||||
|
|
||||||
|
|
||||||
float exposure{ 0.0f };
|
|
||||||
int curve{ ToneMappingEffect::Gamma22 };
|
|
||||||
signals:
|
|
||||||
void dirty();
|
|
||||||
};
|
|
||||||
|
|
||||||
class ToneMappingDeferred {
|
|
||||||
public:
|
|
||||||
// Inputs: lightingFramebuffer, destinationFramebuffer
|
|
||||||
using Input = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
|
|
||||||
using Output = gpu::FramebufferPointer;
|
|
||||||
using Config = ToneMappingConfig;
|
|
||||||
using JobModel = render::Job::ModelIO<ToneMappingDeferred, Input, Output, Config>;
|
|
||||||
|
|
||||||
void configure(const Config& config);
|
|
||||||
void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output);
|
|
||||||
|
|
||||||
ToneMappingEffect _toneMappingEffect;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // hifi_ToneMappingEffect_h
|
|
|
@ -1 +1,2 @@
|
||||||
VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord
|
VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord
|
||||||
|
DEFINES mirrored:f
|
||||||
|
|
|
@ -43,7 +43,11 @@ layout(location=0) in vec2 varTexCoord0;
|
||||||
layout(location=0) out vec4 outFragColor;
|
layout(location=0) out vec4 outFragColor;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
vec4 fragColorRaw = texture(colorMap, varTexCoord0);
|
<@if HIFI_USE_MIRRORED@>
|
||||||
|
vec4 fragColorRaw = texture(colorMap, vec2(1.0 - varTexCoord0.x, varTexCoord0.y));
|
||||||
|
<@else@>
|
||||||
|
vec4 fragColorRaw = texture(colorMap, varTexCoord0);
|
||||||
|
<@endif@>
|
||||||
vec3 fragColor = fragColorRaw.xyz;
|
vec3 fragColor = fragColorRaw.xyz;
|
||||||
|
|
||||||
vec3 srcColor = fragColor * getTwoPowExposure();
|
vec3 srcColor = fragColor * getTwoPowExposure();
|
||||||
|
|
|
@ -1,224 +0,0 @@
|
||||||
//
|
|
||||||
// ResampleTask.cpp
|
|
||||||
// render/src/render
|
|
||||||
//
|
|
||||||
// Various to Resample or downsample textures into framebuffers.
|
|
||||||
//
|
|
||||||
// Created by Olivier Prat on 10/09/17.
|
|
||||||
// Copyright 2017 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 "ToneMapAndResampleTask.h"
|
|
||||||
|
|
||||||
#include <gpu/Context.h>
|
|
||||||
#include <shaders/Shaders.h>
|
|
||||||
|
|
||||||
using namespace render;
|
|
||||||
using namespace shader::gpu::program;
|
|
||||||
/*
|
|
||||||
gpu::PipelinePointer HalfDownsample::_pipeline;
|
|
||||||
|
|
||||||
HalfDownsample::HalfDownsample() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void HalfDownsample::configure(const Config& config) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::FramebufferPointer HalfDownsample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer) {
|
|
||||||
auto resampledFramebufferSize = sourceFramebuffer->getSize();
|
|
||||||
|
|
||||||
resampledFramebufferSize.x /= 2U;
|
|
||||||
resampledFramebufferSize.y /= 2U;
|
|
||||||
|
|
||||||
if (!_destinationFrameBuffer || resampledFramebufferSize != _destinationFrameBuffer->getSize()) {
|
|
||||||
_destinationFrameBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("HalfOutput"));
|
|
||||||
|
|
||||||
auto sampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT);
|
|
||||||
auto target = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), resampledFramebufferSize.x, resampledFramebufferSize.y, gpu::Texture::SINGLE_MIP, sampler);
|
|
||||||
_destinationFrameBuffer->setRenderBuffer(0, target);
|
|
||||||
}
|
|
||||||
return _destinationFrameBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HalfDownsample::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer) {
|
|
||||||
assert(renderContext->args);
|
|
||||||
assert(renderContext->args->hasViewFrustum());
|
|
||||||
RenderArgs* args = renderContext->args;
|
|
||||||
|
|
||||||
resampledFrameBuffer = getResampledFrameBuffer(sourceFramebuffer);
|
|
||||||
|
|
||||||
if (!_pipeline) {
|
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::drawTransformUnitQuadTextureOpaque);
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
|
||||||
state->setDepthTest(gpu::State::DepthTest(false, false));
|
|
||||||
_pipeline = gpu::Pipeline::create(program, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto bufferSize = resampledFrameBuffer->getSize();
|
|
||||||
glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y };
|
|
||||||
|
|
||||||
gpu::doInBatch("HalfDownsample::run", args->_context, [&](gpu::Batch& batch) {
|
|
||||||
batch.enableStereo(false);
|
|
||||||
|
|
||||||
batch.setFramebuffer(resampledFrameBuffer);
|
|
||||||
|
|
||||||
batch.setViewportTransform(viewport);
|
|
||||||
batch.setProjectionTransform(glm::mat4());
|
|
||||||
batch.resetViewTransform();
|
|
||||||
batch.setPipeline(_pipeline);
|
|
||||||
|
|
||||||
batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport));
|
|
||||||
batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0));
|
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
gpu::PipelinePointer Resample::_pipeline;
|
|
||||||
|
|
||||||
void Resample::configure(const Config& config) {
|
|
||||||
_factor = config.factor;
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::FramebufferPointer Resample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer) {
|
|
||||||
if (_factor == 1.0f) {
|
|
||||||
return sourceFramebuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto resampledFramebufferSize = glm::uvec2(glm::vec2(sourceFramebuffer->getSize()) * _factor);
|
|
||||||
|
|
||||||
if (!_destinationFrameBuffer || resampledFramebufferSize != _destinationFrameBuffer->getSize()) {
|
|
||||||
_destinationFrameBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("ResampledOutput"));
|
|
||||||
|
|
||||||
auto sampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR);
|
|
||||||
auto target = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), resampledFramebufferSize.x, resampledFramebufferSize.y, gpu::Texture::SINGLE_MIP, sampler);
|
|
||||||
_destinationFrameBuffer->setRenderBuffer(0, target);
|
|
||||||
}
|
|
||||||
return _destinationFrameBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Resample::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer) {
|
|
||||||
assert(renderContext->args);
|
|
||||||
assert(renderContext->args->hasViewFrustum());
|
|
||||||
RenderArgs* args = renderContext->args;
|
|
||||||
|
|
||||||
resampledFrameBuffer = getResampledFrameBuffer(sourceFramebuffer);
|
|
||||||
if (resampledFrameBuffer != sourceFramebuffer) {
|
|
||||||
if (!_pipeline) {
|
|
||||||
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::drawTransformUnitQuadTextureOpaque);
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
|
||||||
state->setDepthTest(gpu::State::DepthTest(false, false));
|
|
||||||
_pipeline = gpu::Pipeline::create(program, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto bufferSize = resampledFrameBuffer->getSize();
|
|
||||||
glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y };
|
|
||||||
|
|
||||||
gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) {
|
|
||||||
batch.enableStereo(false);
|
|
||||||
|
|
||||||
batch.setFramebuffer(resampledFrameBuffer);
|
|
||||||
|
|
||||||
batch.setViewportTransform(viewport);
|
|
||||||
batch.setProjectionTransform(glm::mat4());
|
|
||||||
batch.resetViewTransform();
|
|
||||||
batch.setPipeline(_pipeline);
|
|
||||||
|
|
||||||
batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport));
|
|
||||||
batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0));
|
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Set full final viewport
|
|
||||||
args->_viewport = viewport;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
ToneMapAndResample::ToneMapAndResample() {
|
|
||||||
Parameters parameters;
|
|
||||||
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) ¶meters));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMapAndResample::setExposure(float exposure) {
|
|
||||||
auto& params = _parametersBuffer.get<Parameters>();
|
|
||||||
if (params._exposure != exposure) {
|
|
||||||
_parametersBuffer.edit<Parameters>()._exposure = exposure;
|
|
||||||
_parametersBuffer.edit<Parameters>()._twoPowExposure = pow(2.0, exposure);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMapAndResample::setToneCurve(ToneCurve curve) {
|
|
||||||
auto& params = _parametersBuffer.get<Parameters>();
|
|
||||||
if (params._toneCurve != (int)curve) {
|
|
||||||
_parametersBuffer.edit<Parameters>()._toneCurve = (int)curve;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ToneMapAndResample::configure(const Config& config) {
|
|
||||||
setExposure(config.exposure);
|
|
||||||
setToneCurve((ToneCurve)config.curve);
|
|
||||||
}
|
|
||||||
|
|
||||||
gpu::PipelinePointer ToneMapAndResample::_pipeline;
|
|
||||||
gpu::PipelinePointer ToneMapAndResample::_mirrorPipeline;
|
|
||||||
|
|
||||||
void ToneMapAndResample::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) {
|
|
||||||
assert(renderContext->args);
|
|
||||||
assert(renderContext->args->hasViewFrustum());
|
|
||||||
RenderArgs* args = renderContext->args;
|
|
||||||
auto sourceFramebuffer = input;
|
|
||||||
|
|
||||||
//auto lightingBuffer = input->getRenderBuffer(0);
|
|
||||||
|
|
||||||
resampledFrameBuffer = args->_blitFramebuffer;
|
|
||||||
/*
|
|
||||||
if (!_pipeline) {
|
|
||||||
init(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lightingBuffer || !blitFramebuffer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (resampledFrameBuffer != sourceFramebuffer) {
|
|
||||||
|
|
||||||
if (!_pipeline) {
|
|
||||||
gpu::StatePointer state = gpu::StatePointer(new gpu::State());
|
|
||||||
|
|
||||||
state->setDepthTest(gpu::State::DepthTest(false, false));
|
|
||||||
//blitState->setColorWriteMask(true, true, true, true);
|
|
||||||
|
|
||||||
_pipeline = gpu::Pipeline::create(gpu::Shader::createProgram(drawTransformUnitQuadTextureOpaque), state);
|
|
||||||
_mirrorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureMirroredX), state);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto bufferSize = resampledFrameBuffer->getSize();
|
|
||||||
|
|
||||||
//auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions());
|
|
||||||
|
|
||||||
glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y };
|
|
||||||
|
|
||||||
gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) {
|
|
||||||
batch.enableStereo(false);
|
|
||||||
batch.setFramebuffer(resampledFrameBuffer);
|
|
||||||
|
|
||||||
batch.setViewportTransform(viewport);
|
|
||||||
batch.setProjectionTransform(glm::mat4());
|
|
||||||
batch.resetViewTransform();
|
|
||||||
batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline);
|
|
||||||
|
|
||||||
// viewport = args->_viewport ??
|
|
||||||
batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport));
|
|
||||||
batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0));
|
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Set full final viewport
|
|
||||||
args->_viewport = viewport;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue