mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 19:42:53 +02:00
FIx the mirror rendering bugs by replacing the prvious technique by a simple true mirror during the final blit for both rear view mirror and full screen mirror, not working for HMD
This commit is contained in:
parent
79e4cdd514
commit
fc0ee28b84
8 changed files with 24 additions and 19 deletions
|
@ -893,14 +893,15 @@ void Application::paintGL() {
|
||||||
|
|
||||||
{
|
{
|
||||||
float ratio = ((float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale());
|
float ratio = ((float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale());
|
||||||
auto mirrorViewport = glm::ivec4(0, 0, _mirrorViewRect.width() * ratio, _mirrorViewRect.height() * ratio);
|
// Flip the src and destination rect horizontally to do the mirror
|
||||||
auto mirrorViewportDest = mirrorViewport;
|
auto mirrorRect = glm::ivec4(0, 0, _mirrorViewRect.width() * ratio, _mirrorViewRect.height() * ratio);
|
||||||
|
auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w);
|
||||||
|
|
||||||
auto selfieFbo = DependencyManager::get<FramebufferCache>()->getSelfieFramebuffer();
|
auto selfieFbo = DependencyManager::get<FramebufferCache>()->getSelfieFramebuffer();
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
batch.setFramebuffer(selfieFbo);
|
batch.setFramebuffer(selfieFbo);
|
||||||
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f));
|
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f));
|
||||||
batch.blit(primaryFbo, mirrorViewport, selfieFbo, mirrorViewportDest);
|
batch.blit(primaryFbo, mirrorRect, selfieFbo, mirrorRectDest);
|
||||||
batch.setFramebuffer(nullptr);
|
batch.setFramebuffer(nullptr);
|
||||||
renderArgs._context->render(batch);
|
renderArgs._context->render(batch);
|
||||||
}
|
}
|
||||||
|
@ -991,8 +992,14 @@ void Application::paintGL() {
|
||||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebufferDepthColor();
|
auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebufferDepthColor();
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
batch.blit(primaryFbo, glm::ivec4(0, 0, _renderResolution.x, _renderResolution.y),
|
|
||||||
nullptr, glm::ivec4(0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height()));
|
if (renderArgs._renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
||||||
|
batch.blit(primaryFbo, glm::ivec4(0, 0, _renderResolution.x, _renderResolution.y),
|
||||||
|
nullptr, glm::ivec4(_glWidget->getDeviceSize().width(), 0, 0, _glWidget->getDeviceSize().height()));
|
||||||
|
} else {
|
||||||
|
batch.blit(primaryFbo, glm::ivec4(0, 0, _renderResolution.x, _renderResolution.y),
|
||||||
|
nullptr, glm::ivec4(0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height()));
|
||||||
|
}
|
||||||
|
|
||||||
batch.setFramebuffer(nullptr);
|
batch.setFramebuffer(nullptr);
|
||||||
|
|
||||||
|
|
|
@ -193,6 +193,7 @@ void ApplicationOverlay::renderRearView(RenderArgs* renderArgs) {
|
||||||
glm::vec2 texCoordMinCorner(0.0f, 0.0f);
|
glm::vec2 texCoordMinCorner(0.0f, 0.0f);
|
||||||
glm::vec2 texCoordMaxCorner(viewport.width() * renderRatio / float(selfieTexture->getWidth()), viewport.height() * renderRatio / float(selfieTexture->getHeight()));
|
glm::vec2 texCoordMaxCorner(viewport.width() * renderRatio / float(selfieTexture->getWidth()), viewport.height() * renderRatio / float(selfieTexture->getHeight()));
|
||||||
|
|
||||||
|
|
||||||
geometryCache->useSimpleDrawPipeline(batch, true);
|
geometryCache->useSimpleDrawPipeline(batch, true);
|
||||||
batch.setResourceTexture(0, selfieTexture);
|
batch.setResourceTexture(0, selfieTexture);
|
||||||
geometryCache->renderQuad(batch, bottomLeft, topRight, texCoordMinCorner, texCoordMaxCorner, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
|
geometryCache->renderQuad(batch, bottomLeft, topRight, texCoordMinCorner, texCoordMaxCorner, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
|
|
@ -106,7 +106,10 @@ public:
|
||||||
void clearStencilFramebuffer(int stencil, bool enableScissor = false); // not a command, just a shortcut for clearFramebuffer, it touches only stencil target
|
void clearStencilFramebuffer(int stencil, bool enableScissor = false); // not a command, just a shortcut for clearFramebuffer, it touches only stencil target
|
||||||
void clearDepthStencilFramebuffer(float depth, int stencil, bool enableScissor = false); // not a command, just a shortcut for clearFramebuffer, it touches depth and stencil target
|
void clearDepthStencilFramebuffer(float depth, int stencil, bool enableScissor = false); // not a command, just a shortcut for clearFramebuffer, it touches depth and stencil target
|
||||||
|
|
||||||
void blit(const FramebufferPointer& src, const Vec4i& srcViewport, const FramebufferPointer& dst, const Vec4i& dstViewport);
|
// Blit src framebuffer to destination
|
||||||
|
// the srcRect and dstRect are the rect region in source and destination framebuffers expressed in pixel space
|
||||||
|
// with xy and zw the bounding corners of the rect region.
|
||||||
|
void blit(const FramebufferPointer& src, const Vec4i& srcRect, const FramebufferPointer& dst, const Vec4i& dstRect);
|
||||||
|
|
||||||
// Query Section
|
// Query Section
|
||||||
void beginQuery(const QueryPointer& query);
|
void beginQuery(const QueryPointer& query);
|
||||||
|
|
|
@ -407,7 +407,7 @@ void DeferredLightingEffect::render(RenderArgs* args) {
|
||||||
args->_viewFrustum->evalProjectionMatrix(projMat);
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
args->_viewFrustum->evalViewTransform(viewMat);
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
||||||
viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
// viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
||||||
}
|
}
|
||||||
batch.setProjectionTransform(projMat);
|
batch.setProjectionTransform(projMat);
|
||||||
batch.setViewTransform(viewMat);
|
batch.setViewTransform(viewMat);
|
||||||
|
|
|
@ -159,7 +159,7 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key,
|
||||||
RenderKey mirrorKey(key.getRaw() | RenderKey::IS_MIRROR);
|
RenderKey mirrorKey(key.getRaw() | RenderKey::IS_MIRROR);
|
||||||
auto mirrorState = std::make_shared<gpu::State>(state->getValues());
|
auto mirrorState = std::make_shared<gpu::State>(state->getValues());
|
||||||
|
|
||||||
mirrorState->setFrontFaceClockwise(true);
|
// mirrorState->setFrontFaceClockwise(true);
|
||||||
|
|
||||||
// create a new RenderPipeline with the same shader side and the mirrorState
|
// create a new RenderPipeline with the same shader side and the mirrorState
|
||||||
auto mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, mirrorState));
|
auto mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, mirrorState));
|
||||||
|
|
|
@ -166,9 +166,7 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend
|
||||||
Transform viewMat;
|
Transform viewMat;
|
||||||
args->_viewFrustum->evalProjectionMatrix(projMat);
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
args->_viewFrustum->evalViewTransform(viewMat);
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
|
||||||
viewMat.preScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
|
||||||
}
|
|
||||||
batch.setProjectionTransform(projMat);
|
batch.setProjectionTransform(projMat);
|
||||||
batch.setViewTransform(viewMat);
|
batch.setViewTransform(viewMat);
|
||||||
|
|
||||||
|
@ -197,9 +195,7 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const
|
||||||
Transform viewMat;
|
Transform viewMat;
|
||||||
args->_viewFrustum->evalProjectionMatrix(projMat);
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
args->_viewFrustum->evalViewTransform(viewMat);
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
|
||||||
viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
|
||||||
}
|
|
||||||
batch.setProjectionTransform(projMat);
|
batch.setProjectionTransform(projMat);
|
||||||
batch.setViewTransform(viewMat);
|
batch.setViewTransform(viewMat);
|
||||||
|
|
||||||
|
@ -259,9 +255,7 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon
|
||||||
Transform viewMat;
|
Transform viewMat;
|
||||||
args->_viewFrustum->evalProjectionMatrix(projMat);
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
args->_viewFrustum->evalViewTransform(viewMat);
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
|
||||||
viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
|
||||||
}
|
|
||||||
batch.setProjectionTransform(projMat);
|
batch.setProjectionTransform(projMat);
|
||||||
batch.setViewTransform(viewMat);
|
batch.setViewTransform(viewMat);
|
||||||
batch.setViewportTransform(args->_viewport);
|
batch.setViewportTransform(args->_viewport);
|
||||||
|
|
|
@ -133,7 +133,7 @@ void DrawStatus::run(const SceneContextPointer& sceneContext, const RenderContex
|
||||||
args->_viewFrustum->evalProjectionMatrix(projMat);
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
args->_viewFrustum->evalViewTransform(viewMat);
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
||||||
viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
// viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
||||||
}
|
}
|
||||||
batch.setProjectionTransform(projMat);
|
batch.setProjectionTransform(projMat);
|
||||||
batch.setViewTransform(viewMat);
|
batch.setViewTransform(viewMat);
|
||||||
|
|
|
@ -265,7 +265,7 @@ void DrawBackground::run(const SceneContextPointer& sceneContext, const RenderCo
|
||||||
args->_viewFrustum->evalProjectionMatrix(projMat);
|
args->_viewFrustum->evalProjectionMatrix(projMat);
|
||||||
args->_viewFrustum->evalViewTransform(viewMat);
|
args->_viewFrustum->evalViewTransform(viewMat);
|
||||||
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
|
||||||
viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
// viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
|
||||||
}
|
}
|
||||||
batch.setProjectionTransform(projMat);
|
batch.setProjectionTransform(projMat);
|
||||||
batch.setViewTransform(viewMat);
|
batch.setViewTransform(viewMat);
|
||||||
|
|
Loading…
Reference in a new issue