Bringing back brownBis to just msaa support

This commit is contained in:
Sam Gateau 2019-02-11 19:42:05 -08:00
parent 8a4f7fe2b6
commit 9ad783135c
12 changed files with 43 additions and 122 deletions

View file

@ -66,6 +66,7 @@ void GraphicsEngine::initializeGPU(GLWidget* glwidget) {
} }
void GraphicsEngine::initializeRender(bool disableDeferred) { void GraphicsEngine::initializeRender(bool disableDeferred) {
// Set up the render engine // Set up the render engine
render::CullFunctor cullFunctor = LODManager::shouldRender; render::CullFunctor cullFunctor = LODManager::shouldRender;
_renderEngine->addJob<UpdateSceneTask>("UpdateScene"); _renderEngine->addJob<UpdateSceneTask>("UpdateScene");

View file

@ -354,14 +354,14 @@ void OpenGLDisplayPlugin::customizeContext() {
if ((image.width() > 0) && (image.height() > 0)) { if ((image.width() > 0) && (image.height() > 0)) {
cursorData.texture = gpu::Texture::createStrict( cursorData.texture = gpu::Texture::createStrict(
gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::SRGBA), gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA),
image.width(), image.height(), image.width(), image.height(),
gpu::Texture::MAX_NUM_MIPS, gpu::Texture::MAX_NUM_MIPS,
gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)); gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR));
cursorData.texture->setSource("cursor texture"); cursorData.texture->setSource("cursor texture");
auto usage = gpu::Texture::Usage::Builder().withColor().withAlpha(); auto usage = gpu::Texture::Usage::Builder().withColor().withAlpha();
cursorData.texture->setUsage(usage.build()); cursorData.texture->setUsage(usage.build());
cursorData.texture->setStoredMipFormat(gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::SRGBA)); cursorData.texture->setStoredMipFormat(gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA));
cursorData.texture->assignStoredMip(0, image.byteCount(), image.constBits()); cursorData.texture->assignStoredMip(0, image.byteCount(), image.constBits());
cursorData.texture->setAutoGenerateMips(true); cursorData.texture->setAutoGenerateMips(true);
} }
@ -382,13 +382,12 @@ void OpenGLDisplayPlugin::customizeContext() {
{ {
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture); gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
_simplePipeline = gpu::Pipeline::create(program, scissorState); _simplePipeline = gpu::Pipeline::create(program, scissorState);
// _hudPipeline = gpu::Pipeline::create(program, blendState); _hudPipeline = gpu::Pipeline::create(program, blendState);
} }
{ {
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::display_plugins::program::SrgbToLinear); gpu::ShaderPointer program = gpu::Shader::createProgram(shader::display_plugins::program::SrgbToLinear);
_presentPipeline = gpu::Pipeline::create(program, scissorState); _presentPipeline = gpu::Pipeline::create(program, scissorState);
_hudPipeline = gpu::Pipeline::create(program, blendState);
} }
{ {
@ -515,8 +514,7 @@ void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::Textur
batch.setViewportTransform(viewport); batch.setViewportTransform(viewport);
batch.setResourceTexture(0, texture); batch.setResourceTexture(0, texture);
#ifndef USE_GLES #ifndef USE_GLES
batch.setPipeline(_simplePipeline); batch.setPipeline(_presentPipeline);
// batch.setPipeline(_presentPipeline);
#else #else
batch.setPipeline(_simplePipeline); batch.setPipeline(_simplePipeline);
#endif #endif
@ -607,7 +605,7 @@ void OpenGLDisplayPlugin::compositePointer() {
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
batch.enableStereo(false); batch.enableStereo(false);
batch.setProjectionTransform(mat4()); batch.setProjectionTransform(mat4());
// batch.setFramebuffer(_compositeFramebuffer); batch.setFramebuffer(_compositeFramebuffer);
batch.setPipeline(_cursorPipeline); batch.setPipeline(_cursorPipeline);
batch.setResourceTexture(0, cursorData.texture); batch.setResourceTexture(0, cursorData.texture);
batch.resetViewTransform(); batch.resetViewTransform();
@ -643,7 +641,7 @@ void OpenGLDisplayPlugin::compositeLayers() {
{ {
PROFILE_RANGE_EX(render_detail, "compositeScene", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX(render_detail, "compositeScene", 0xff0077ff, (uint64_t)presentCount())
// compositeScene(); compositeScene();
} }
#ifdef HIFI_ENABLE_NSIGHT_DEBUG #ifdef HIFI_ENABLE_NSIGHT_DEBUG
@ -657,10 +655,10 @@ void OpenGLDisplayPlugin::compositeLayers() {
}); });
} }
/* { {
PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount())
compositeExtra(); compositeExtra();
}*/ }
// Draw the pointer last so it's on top of everything // Draw the pointer last so it's on top of everything
auto compositorHelper = DependencyManager::get<CompositorHelper>(); auto compositorHelper = DependencyManager::get<CompositorHelper>();
@ -675,8 +673,7 @@ void OpenGLDisplayPlugin::internalPresent() {
// Note: _displayTexture must currently be the same size as the display. // Note: _displayTexture must currently be the same size as the display.
uvec2 dims = _displayTexture ? uvec2(_displayTexture->getDimensions()) : getSurfacePixels(); uvec2 dims = _displayTexture ? uvec2(_displayTexture->getDimensions()) : getSurfacePixels();
auto viewport = ivec4(uvec2(0), dims); auto viewport = ivec4(uvec2(0), dims);
// renderFromTexture(batch, _displayTexture ? _displayTexture : _compositeFramebuffer->getRenderBuffer(0), viewport, viewport); renderFromTexture(batch, _displayTexture ? _displayTexture : _compositeFramebuffer->getRenderBuffer(0), viewport, viewport);
renderFromTexture(batch, _displayTexture ? _displayTexture : _currentFrame->framebuffer->getRenderBuffer(0), viewport, viewport);
}); });
swapBuffers(); swapBuffers();
_presentRate.increment(); _presentRate.increment();
@ -885,7 +882,7 @@ OpenGLDisplayPlugin::~OpenGLDisplayPlugin() {
void OpenGLDisplayPlugin::updateCompositeFramebuffer() { void OpenGLDisplayPlugin::updateCompositeFramebuffer() {
auto renderSize = glm::uvec2(getRecommendedRenderSize()); auto renderSize = glm::uvec2(getRecommendedRenderSize());
if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) { if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) {
_compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_SRGBA_32, renderSize.x, renderSize.y)); _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y));
} }
} }

View file

@ -17,31 +17,6 @@ vec3 colorToLinearRGB(vec3 srgb) {
} }
void main(void) { void main(void) {
vec4 fetched = texture(colorMap, varTexCoord0); outFragColor.a = 1.0;
//outFragColor = fetched; outFragColor.rgb = colorToLinearRGB(texture(colorMap, varTexCoord0).rgb);
outFragColor.a = fetched.a;
outFragColor.rgb = pow(fetched.rgb, vec3(2.2));
/* int vSize = 300;
int hSize = 400;
if (gl_FragCoord.y < vSize) {
finalColor *= pow(2.0, 0.1);
}
else if (gl_FragCoord.y > 2 * vSize) {
finalColor *= pow(2.0, -0.1);
}
else {
finalColor;
}
if (gl_FragCoord.x <hSize) {
outFragColor.rgb = colorToLinearRGB(finalColor);
} else if (gl_FragCoord.x > 2 * hSize) {
outFragColor.rgb = pow(finalColor, vec3(1.0 / 2.2));
}
else {
outFragColor.rgb = finalColor;
}*/
// outFragColor.rgb = sqrt(finalColor);
} }

View file

@ -260,9 +260,7 @@ void HmdDisplayPlugin::internalPresent() {
viewport.z *= 2; viewport.z *= 2;
} }
// renderFromTexture(batch, _compositeFramebuffer->getRenderBuffer(0), viewport, scissor, fbo); renderFromTexture(batch, _compositeFramebuffer->getRenderBuffer(0), viewport, scissor, fbo);
renderFromTexture(batch, _currentFrame->framebuffer->getRenderBuffer(0), viewport, scissor, fbo);
}); });
swapBuffers(); swapBuffers();

View file

@ -99,7 +99,6 @@ const QSurfaceFormat& getDefaultOpenGLSurfaceFormat() {
#else #else
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile); format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
#endif #endif
format.setColorSpace(QSurfaceFormat::sRGBColorSpace);
if (gl::Context::enableDebugLogger()) { if (gl::Context::enableDebugLogger()) {
format.setOption(QSurfaceFormat::DebugContext); format.setOption(QSurfaceFormat::DebugContext);

View file

@ -278,6 +278,7 @@ public:
FillMode fillMode{ FILL_FACE }; FillMode fillMode{ FILL_FACE };
CullMode cullMode{ CULL_NONE }; CullMode cullMode{ CULL_NONE };
ColorMask colorWriteMask{ WRITE_ALL }; ColorMask colorWriteMask{ WRITE_ALL };
Flags flags; Flags flags;
}; };

View file

@ -118,22 +118,22 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
const auto transparentInputs = DrawForward::Inputs(transparents, lightingModel).asVarying(); const auto transparentInputs = DrawForward::Inputs(transparents, lightingModel).asVarying();
task.addJob<DrawForward>("DrawTransparents", transparentInputs, shapePlumber); task.addJob<DrawForward>("DrawTransparents", transparentInputs, shapePlumber);
/* { // Debug the bounds of the rendered items, still look at the zbuffer { // Debug the bounds of the rendered items, still look at the zbuffer
task.addJob<DrawBounds>("DrawMetaBounds", metas); task.addJob<DrawBounds>("DrawMetaBounds", metas);
task.addJob<DrawBounds>("DrawBounds", opaques); task.addJob<DrawBounds>("DrawBounds", opaques);
task.addJob<DrawBounds>("DrawTransparentBounds", transparents); task.addJob<DrawBounds>("DrawTransparentBounds", transparents);
task.addJob<DrawBounds>("DrawZones", zones);*/ task.addJob<DrawBounds>("DrawZones", zones);
const auto debugZoneInputs = DebugZoneLighting::Inputs(deferredFrameTransform, lightFrame, backgroundFrame).asVarying(); const auto debugZoneInputs = DebugZoneLighting::Inputs(deferredFrameTransform, lightFrame, backgroundFrame).asVarying();
task.addJob<DebugZoneLighting>("DrawZoneStack", debugZoneInputs); task.addJob<DebugZoneLighting>("DrawZoneStack", debugZoneInputs);
// } }
// Lighting Buffer ready for tone mapping // Lighting Buffer ready for tone mapping
// Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify // Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify
// the output FBO as null, which causes the tonemapping to target the blit framebuffer // the output FBO as null, which causes the tonemapping to target the blit framebuffer
// const auto toneMappingInputs = ToneMappingDeferred::Inputs(framebuffer, static_cast<gpu::FramebufferPointer>(nullptr) ).asVarying(); const auto toneMappingInputs = ToneMappingDeferred::Inputs(framebuffer, static_cast<gpu::FramebufferPointer>(nullptr) ).asVarying();
// task.addJob<ToneMappingDeferred>("ToneMapping", toneMappingInputs); task.addJob<ToneMappingDeferred>("ToneMapping", toneMappingInputs);
// Layered Overlays // Layered Overlays
// Composite the HUD and HUD overlays // Composite the HUD and HUD overlays
@ -141,40 +141,29 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
// Disable blit because we do tonemapping and compositing directly to the blit FBO // Disable blit because we do tonemapping and compositing directly to the blit FBO
// Blit! // Blit!
task.addJob<Blit>("Blit", framebuffer); // task.addJob<Blit>("Blit", framebuffer);
}
void PrepareFramebuffer::configure(const PrepareFramebuffer::Config& config) {
_numSamples = config.getNumSamples();
} }
void PrepareFramebuffer::run(const RenderContextPointer& renderContext, gpu::FramebufferPointer& framebuffer) { void PrepareFramebuffer::run(const RenderContextPointer& renderContext, gpu::FramebufferPointer& framebuffer) {
glm::uvec2 frameSize(renderContext->args->_viewport.z, renderContext->args->_viewport.w); glm::uvec2 frameSize(renderContext->args->_viewport.z, renderContext->args->_viewport.w);
// Resizing framebuffers instead of re-building them seems to cause issues with threaded rendering // Resizing framebuffers instead of re-building them seems to cause issues with threaded rendering
if (_framebuffer && (_framebuffer->getSize() != frameSize || _framebuffer->getNumSamples() != _numSamples)) { if (_framebuffer && _framebuffer->getSize() != frameSize) {
_framebuffer.reset(); _framebuffer.reset();
} }
if (!_framebuffer) { if (!_framebuffer) {
_framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("forward")); _framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("forward"));
int numSamples = _numSamples;
auto colorFormat = gpu::Element::COLOR_SRGBA_32; auto colorFormat = gpu::Element::COLOR_SRGBA_32;
auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT);
/* auto colorTexture =
gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler);
_framebuffer->setRenderBuffer(0, colorTexture);*/
auto colorTexture = auto colorTexture =
gpu::Texture::createRenderBufferMultisample(colorFormat, frameSize.x, frameSize.y, numSamples, defaultSampler); gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler);
_framebuffer->setRenderBuffer(0, colorTexture); _framebuffer->setRenderBuffer(0, colorTexture);
auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format
/* auto depthTexture =
gpu::Texture::createRenderBuffer(depthFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler);
_framebuffer->setDepthStencilBuffer(depthTexture, depthFormat);*/
auto depthTexture = auto depthTexture =
gpu::Texture::createRenderBufferMultisample(depthFormat, frameSize.x, frameSize.y, numSamples, defaultSampler); gpu::Texture::createRenderBuffer(depthFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler);
_framebuffer->setDepthStencilBuffer(depthTexture, depthFormat); _framebuffer->setDepthStencilBuffer(depthTexture, depthFormat);
} }

View file

@ -27,33 +27,16 @@ public:
void build(JobModel& task, const render::Varying& input, render::Varying& output); void build(JobModel& task, const render::Varying& input, render::Varying& output);
}; };
class PrepareFramebufferConfig : public render::Job::Config {
Q_OBJECT
Q_PROPERTY(int numSamples WRITE setNumSamples READ getNumSamples NOTIFY dirty)
public:
int getNumSamples() const { return numSamples; }
void setNumSamples(int num) { numSamples = num; emit dirty(); }
signals:
void dirty();
protected:
int numSamples{ 8 };
};
class PrepareFramebuffer { class PrepareFramebuffer {
public: public:
using Inputs = gpu::FramebufferPointer; using Inputs = gpu::FramebufferPointer;
using Config = PrepareFramebufferConfig; using JobModel = render::Job::ModelO<PrepareFramebuffer, Inputs>;
using JobModel = render::Job::ModelO<PrepareFramebuffer, Inputs, Config>;
void configure(const Config& config);
void run(const render::RenderContextPointer& renderContext, void run(const render::RenderContextPointer& renderContext,
gpu::FramebufferPointer& framebuffer); gpu::FramebufferPointer& framebuffer);
private: private:
gpu::FramebufferPointer _framebuffer; gpu::FramebufferPointer _framebuffer;
int _numSamples { 8 };
}; };
class PrepareForward { class PrepareForward {

View file

@ -40,13 +40,6 @@ void ToneMappingEffect::setExposure(float exposure) {
} }
} }
void ToneMappingEffect::setColorFilter(const glm::vec3& colorFilter) {
auto& params = _parametersBuffer.get<Parameters>();
if (params._colorFilter != colorFilter) {
_parametersBuffer.edit<Parameters>()._colorFilter = colorFilter;
}
}
void ToneMappingEffect::setToneCurve(ToneCurve curve) { void ToneMappingEffect::setToneCurve(ToneCurve curve) {
auto& params = _parametersBuffer.get<Parameters>(); auto& params = _parametersBuffer.get<Parameters>();
if (params._toneCurve != curve) { if (params._toneCurve != curve) {
@ -69,6 +62,9 @@ void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& ligh
batch.enableStereo(false); batch.enableStereo(false);
batch.setFramebuffer(destinationFramebuffer); batch.setFramebuffer(destinationFramebuffer);
// FIXME: Generate the Luminosity map
//batch.generateTextureMips(lightingBuffer);
batch.setViewportTransform(args->_viewport); batch.setViewportTransform(args->_viewport);
batch.setProjectionTransform(glm::mat4()); batch.setProjectionTransform(glm::mat4());
batch.resetViewTransform(); batch.resetViewTransform();
@ -84,7 +80,6 @@ void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& ligh
void ToneMappingDeferred::configure(const Config& config) { void ToneMappingDeferred::configure(const Config& config) {
_toneMappingEffect.setExposure(config.exposure); _toneMappingEffect.setExposure(config.exposure);
_toneMappingEffect.setColorFilter(toGlm(config.colorFilter));
_toneMappingEffect.setToneCurve((ToneMappingEffect::ToneCurve)config.curve); _toneMappingEffect.setToneCurve((ToneMappingEffect::ToneCurve)config.curve);
} }

View file

@ -31,9 +31,6 @@ public:
void setExposure(float exposure); void setExposure(float exposure);
float getExposure() const { return _parametersBuffer.get<Parameters>()._exposure; } float getExposure() const { return _parametersBuffer.get<Parameters>()._exposure; }
void setColorFilter(const glm::vec3& colorFilter);
glm::vec3 getColorFIlter() const { return _parametersBuffer.get<Parameters>()._colorFilter; }
// Different tone curve available // Different tone curve available
enum ToneCurve { enum ToneCurve {
None = 0, None = 0,
@ -54,10 +51,8 @@ private:
float _exposure = 0.0f; float _exposure = 0.0f;
float _twoPowExposure = 1.0f; float _twoPowExposure = 1.0f;
glm::vec2 spareA; glm::vec2 spareA;
glm::vec3 _colorFilter{ 1.0f }; int _toneCurve = Gamma22;
float spareB; glm::vec3 spareB;
int _toneCurve = None;
glm::vec3 spareC;
Parameters() {} Parameters() {}
}; };
@ -70,19 +65,16 @@ private:
class ToneMappingConfig : public render::Job::Config { class ToneMappingConfig : public render::Job::Config {
Q_OBJECT Q_OBJECT
Q_PROPERTY(float exposure MEMBER exposure WRITE setExposure); Q_PROPERTY(float exposure MEMBER exposure WRITE setExposure);
Q_PROPERTY(QColor colorFilter MEMBER colorFilter WRITE setColorFilter);
Q_PROPERTY(int curve MEMBER curve WRITE setCurve); Q_PROPERTY(int curve MEMBER curve WRITE setCurve);
public: public:
ToneMappingConfig() : render::Job::Config(true) {} ToneMappingConfig() : render::Job::Config(true) {}
void setExposure(float newExposure) { exposure = newExposure; emit dirty(); } void setExposure(float newExposure) { exposure = newExposure; emit dirty(); }
void setColorFilter(const QColor& newColorFilter) { colorFilter = newColorFilter; emit dirty(); }
void setCurve(int newCurve) { curve = std::max((int)ToneMappingEffect::None, std::min((int)ToneMappingEffect::Filmic, newCurve)); emit dirty(); } void setCurve(int newCurve) { curve = std::max((int)ToneMappingEffect::None, std::min((int)ToneMappingEffect::Filmic, newCurve)); emit dirty(); }
float exposure{ 0.0f }; float exposure{ 0.0f };
QColor colorFilter { 255, 255, 255 }; int curve{ ToneMappingEffect::Gamma22 };
int curve{ ToneMappingEffect::None };
signals: signals:
void dirty(); void dirty();
}; };

View file

@ -17,7 +17,6 @@
struct ToneMappingParams { struct ToneMappingParams {
vec4 _exp_2powExp_s0_s1; vec4 _exp_2powExp_s0_s1;
vec4 _colorFilter_s0;
ivec4 _toneCurve_s0_s1_s2; ivec4 _toneCurve_s0_s1_s2;
}; };
@ -33,14 +32,11 @@ LAYOUT(binding=RENDER_UTILS_BUFFER_TM_PARAMS) uniform toneMappingParamsBuffer {
float getTwoPowExposure() { float getTwoPowExposure() {
return params._exp_2powExp_s0_s1.y; return params._exp_2powExp_s0_s1.y;
} }
vec3 getColorFilter() {
return params._colorFilter_s0.xyz;
}
int getToneCurve() { int getToneCurve() {
return params._toneCurve_s0_s1_s2.x; return params._toneCurve_s0_s1_s2.x;
} }
LAYOUT(binding = RENDER_UTILS_TEXTURE_TM_COLOR) uniform sampler2D colorMap; LAYOUT(binding=RENDER_UTILS_TEXTURE_TM_COLOR) uniform sampler2D colorMap;
layout(location=0) in vec2 varTexCoord0; layout(location=0) in vec2 varTexCoord0;
layout(location=0) out vec4 outFragColor; layout(location=0) out vec4 outFragColor;
@ -49,7 +45,7 @@ void main(void) {
vec4 fragColorRaw = texture(colorMap, varTexCoord0); vec4 fragColorRaw = texture(colorMap, varTexCoord0);
vec3 fragColor = fragColorRaw.xyz; vec3 fragColor = fragColorRaw.xyz;
vec3 srcColor = fragColor * getColorFilter() * getTwoPowExposure(); vec3 srcColor = fragColor * getTwoPowExposure();
int toneCurve = getToneCurve(); int toneCurve = getToneCurve();
vec3 tonedColor = srcColor; vec3 tonedColor = srcColor;
@ -58,7 +54,7 @@ void main(void) {
tonedColor = (x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06); tonedColor = (x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06);
} else if (toneCurve == ToneCurveReinhard) { } else if (toneCurve == ToneCurveReinhard) {
tonedColor = srcColor/(1.0 + srcColor); tonedColor = srcColor/(1.0 + srcColor);
// tonedColor = pow(tonedColor, vec3(INV_GAMMA_22)); tonedColor = pow(tonedColor, vec3(INV_GAMMA_22));
} else if (toneCurve == ToneCurveGamma22) { } else if (toneCurve == ToneCurveGamma22) {
tonedColor = pow(srcColor, vec3(INV_GAMMA_22)); tonedColor = pow(srcColor, vec3(INV_GAMMA_22));
} // else None toned = src } // else None toned = src

View file

@ -150,26 +150,21 @@ void OculusDisplayPlugin::hmdPresent() {
// Manually bind the texture to the FBO // Manually bind the texture to the FBO
// FIXME we should have a way of wrapping raw GL ids in GPU objects without // FIXME we should have a way of wrapping raw GL ids in GPU objects without
// taking ownership of the object // taking ownership of the object
auto srcfbo = getGLBackend()->getFramebufferID(_currentFrame->framebuffer); auto fbo = getGLBackend()->getFramebufferID(_outputFramebuffer);
auto dstfbo = getGLBackend()->getFramebufferID(_outputFramebuffer); glNamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0, curTexId, 0);
glNamedFramebufferTexture(dstfbo, GL_COLOR_ATTACHMENT0, curTexId, 0);
auto viewport = ivec4(uvec2(), _outputFramebuffer->getSize()); auto viewport = ivec4(uvec2(), _outputFramebuffer->getSize());
/* render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
batch.enableStereo(false); batch.enableStereo(false);
batch.setFramebuffer(_outputFramebuffer); batch.setFramebuffer(_outputFramebuffer);
batch.setViewportTransform(ivec4(uvec2(), _outputFramebuffer->getSize())); batch.setViewportTransform(ivec4(uvec2(), _outputFramebuffer->getSize()));
batch.setStateScissorRect(ivec4(uvec2(), _outputFramebuffer->getSize())); batch.setStateScissorRect(ivec4(uvec2(), _outputFramebuffer->getSize()));
batch.resetViewTransform(); batch.resetViewTransform();
batch.setProjectionTransform(mat4()); batch.setProjectionTransform(mat4());
// batch.setPipeline(_presentPipeline); batch.setPipeline(_presentPipeline);
batch.setPipeline(_simplePipeline); batch.setResourceTexture(0, _compositeFramebuffer->getRenderBuffer(0));
// batch.setResourceTexture(0, _compositeFramebuffer->getRenderBuffer(0));
batch.setResourceTexture(0, _currentFrame->framebuffer->getRenderBuffer(0));
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
});*/ });
glBlitNamedFramebuffer(srcfbo, dstfbo, viewport.x, viewport.y, viewport.z, viewport.w, viewport.x, viewport.y, glNamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0, 0, 0);
viewport.z, viewport.w, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glNamedFramebufferTexture(dstfbo, GL_COLOR_ATTACHMENT0, 0, 0);
} }
{ {