mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-30 09:02:57 +02:00
142 lines
4.6 KiB
C++
142 lines
4.6 KiB
C++
//
|
|
// DeferredFramebuffer.h
|
|
// libraries/render-utils/src/
|
|
//
|
|
// Created by Sam Gateau 7/11/2016.
|
|
// Copyright 2016 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 "DeferredFramebuffer.h"
|
|
|
|
|
|
DeferredFramebuffer::DeferredFramebuffer() {
|
|
}
|
|
|
|
|
|
void DeferredFramebuffer::updatePrimaryDepth(const gpu::TexturePointer& depthBuffer) {
|
|
//If the depth buffer or size changed, we need to delete our FBOs
|
|
bool reset = false;
|
|
if ((_primaryDepthTexture != depthBuffer)) {
|
|
_primaryDepthTexture = depthBuffer;
|
|
reset = true;
|
|
}
|
|
if (_primaryDepthTexture) {
|
|
auto newFrameSize = glm::ivec2(_primaryDepthTexture->getDimensions());
|
|
if (_frameSize != newFrameSize) {
|
|
_frameSize = newFrameSize;
|
|
reset = true;
|
|
}
|
|
}
|
|
|
|
if (reset) {
|
|
_deferredFramebuffer.reset();
|
|
_deferredFramebufferDepthColor.reset();
|
|
_deferredColorTexture.reset();
|
|
_deferredNormalTexture.reset();
|
|
_deferredSpecularTexture.reset();
|
|
_lightingTexture.reset();
|
|
_lightingFramebuffer.reset();
|
|
}
|
|
}
|
|
|
|
void DeferredFramebuffer::allocate() {
|
|
|
|
_deferredFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("deferred"));
|
|
_deferredFramebufferDepthColor = gpu::FramebufferPointer(gpu::Framebuffer::create("deferredDepthColor"));
|
|
|
|
auto colorFormat = gpu::Element::COLOR_SRGBA_32;
|
|
auto linearFormat = gpu::Element::COLOR_RGBA_32;
|
|
auto width = _frameSize.x;
|
|
auto height = _frameSize.y;
|
|
|
|
auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT);
|
|
|
|
_deferredColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
|
_deferredNormalTexture = gpu::TexturePointer(gpu::Texture::create2D(linearFormat, width, height, defaultSampler));
|
|
_deferredSpecularTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
|
|
|
|
_deferredFramebuffer->setRenderBuffer(0, _deferredColorTexture);
|
|
_deferredFramebuffer->setRenderBuffer(1, _deferredNormalTexture);
|
|
_deferredFramebuffer->setRenderBuffer(2, _deferredSpecularTexture);
|
|
|
|
_deferredFramebufferDepthColor->setRenderBuffer(0, _deferredColorTexture);
|
|
|
|
auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format
|
|
if (!_primaryDepthTexture) {
|
|
_primaryDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler));
|
|
}
|
|
|
|
_deferredFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
|
|
|
_deferredFramebufferDepthColor->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
|
|
|
|
|
auto smoothSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR);
|
|
|
|
_lightingTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10), width, height, defaultSampler));
|
|
_lightingFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("lighting"));
|
|
_lightingFramebuffer->setRenderBuffer(0, _lightingTexture);
|
|
_lightingFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
|
|
|
|
_deferredFramebuffer->setRenderBuffer(3, _lightingTexture);
|
|
|
|
}
|
|
|
|
|
|
gpu::TexturePointer DeferredFramebuffer::getPrimaryDepthTexture() {
|
|
if (!_primaryDepthTexture) {
|
|
allocate();
|
|
}
|
|
return _primaryDepthTexture;
|
|
}
|
|
|
|
gpu::FramebufferPointer DeferredFramebuffer::getDeferredFramebuffer() {
|
|
if (!_deferredFramebuffer) {
|
|
allocate();
|
|
}
|
|
return _deferredFramebuffer;
|
|
}
|
|
|
|
gpu::FramebufferPointer DeferredFramebuffer::getDeferredFramebufferDepthColor() {
|
|
if (!_deferredFramebufferDepthColor) {
|
|
allocate();
|
|
}
|
|
return _deferredFramebufferDepthColor;
|
|
}
|
|
|
|
gpu::TexturePointer DeferredFramebuffer::getDeferredColorTexture() {
|
|
if (!_deferredColorTexture) {
|
|
allocate();
|
|
}
|
|
return _deferredColorTexture;
|
|
}
|
|
|
|
gpu::TexturePointer DeferredFramebuffer::getDeferredNormalTexture() {
|
|
if (!_deferredNormalTexture) {
|
|
allocate();
|
|
}
|
|
return _deferredNormalTexture;
|
|
}
|
|
|
|
gpu::TexturePointer DeferredFramebuffer::getDeferredSpecularTexture() {
|
|
if (!_deferredSpecularTexture) {
|
|
allocate();
|
|
}
|
|
return _deferredSpecularTexture;
|
|
}
|
|
|
|
gpu::FramebufferPointer DeferredFramebuffer::getLightingFramebuffer() {
|
|
if (!_lightingFramebuffer) {
|
|
allocate();
|
|
}
|
|
return _lightingFramebuffer;
|
|
}
|
|
|
|
gpu::TexturePointer DeferredFramebuffer::getLightingTexture() {
|
|
if (!_lightingTexture) {
|
|
allocate();
|
|
}
|
|
return _lightingTexture;
|
|
}
|