History

BRinging the intermediate render textures in the pipeline as varyings and not throug the singletonn anymore

samcake committed 10 years ago

Commit e0993c51 parent ba759072 files · +263 −0Browse files

Showing the changes to libraries/render-utils/src/DeferredFramebuffer.cpp (1 of 2 files). Show all

Unified · Split

libraries/render-utils/src/DeferredFramebuffer.cpp+182−0
@@ -0,0 +1,182 @@
1+//
2+// DeferredFramebuffer.h
3+// libraries/render-utils/src/
4+//
5+// Created by Sam Gateau 7/11/2016.
6+// Copyright 2016 High Fidelity, Inc.
7+//
8+// Distributed under the Apache License, Version 2.0.
9+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10+//
11+#include "DeferredFramebuffer.h"
12+
13+
14+DeferredFramebuffer::DeferredFramebuffer() {
15+}
16+
17+
18+void DeferredFramebuffer::setPrimaryDepth(const gpu::TexturePointer& depthBuffer) {
19+ //If the size changed, we need to delete our FBOs
20+ if (_primaryDepthTexture != depthBuffer) {
21+ _primaryDepthTexture = depthBuffer;
22+
23+ }
24+}
25+
26+void DeferredFramebuffer::setFrameSize(const glm::ivec2& frameBufferSize) {
27+ //If the size changed, we need to delete our FBOs
28+ if (_frameSize != frameBufferSize) {
29+ _frameSize = frameBufferSize;
30+ _deferredFramebuffer.reset();
31+ _deferredFramebufferDepthColor.reset();
32+ _deferredColorTexture.reset();
33+ _deferredNormalTexture.reset();
34+ _deferredSpecularTexture.reset();
35+ _lightingTexture.reset();
36+ _lightingFramebuffer.reset();
37+
38+ _occlusionFramebuffer.reset();
39+ _occlusionTexture.reset();
40+ _occlusionBlurredFramebuffer.reset();
41+ _occlusionBlurredTexture.reset();
42+ }
43+}
44+
45+void DeferredFramebuffer::allocate() {
46+ _deferredFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
47+ _deferredFramebufferDepthColor = gpu::FramebufferPointer(gpu::Framebuffer::create());
48+
49+ auto colorFormat = gpu::Element::COLOR_SRGBA_32;
50+ auto linearFormat = gpu::Element::COLOR_RGBA_32;
51+ auto width = _frameSize.x;
52+ auto height = _frameSize.y;
53+
54+ auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT);
55+ // _primaryColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
56+
57+ // _primaryFramebuffer->setRenderBuffer(0, _primaryColorTexture);
58+
59+ _deferredColorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
60+
61+ _deferredNormalTexture = gpu::TexturePointer(gpu::Texture::create2D(linearFormat, width, height, defaultSampler));
62+ _deferredSpecularTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
63+
64+ _deferredFramebuffer->setRenderBuffer(0, _deferredColorTexture);
65+ _deferredFramebuffer->setRenderBuffer(1, _deferredNormalTexture);
66+ _deferredFramebuffer->setRenderBuffer(2, _deferredSpecularTexture);
67+
68+ _deferredFramebufferDepthColor->setRenderBuffer(0, _deferredColorTexture);
69+
70+ // auto depthFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::DEPTH);
71+
72+ auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format
73+ if (!_primaryDepthTexture) {
74+ _primaryDepthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, width, height, defaultSampler));
75+ }
76+
77+ _deferredFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
78+
79+ _deferredFramebufferDepthColor->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
80+
81+
82+ auto smoothSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR);
83+
84+ _lightingTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10), width, height, defaultSampler));
85+ _lightingFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
86+ _lightingFramebuffer->setRenderBuffer(0, _lightingTexture);
87+ _lightingFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
88+
89+ _deferredFramebuffer->setRenderBuffer(3, _lightingTexture);
90+
91+ // For AO:
92+ // auto pointMipSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_POINT);
93+ // _depthPyramidTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::RGB), width, height, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT)));
94+ // _depthPyramidFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
95+ // _depthPyramidFramebuffer->setRenderBuffer(0, _depthPyramidTexture);
96+ // _depthPyramidFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
97+
98+ // resizeAmbientOcclusionBuffers();
99+}
100+
101+/*
102+void DeferredFramebuffer::resizeAmbientOcclusionBuffers() {
103+ _occlusionFramebuffer.reset();
104+ _occlusionTexture.reset();
105+ _occlusionBlurredFramebuffer.reset();
106+ _occlusionBlurredTexture.reset();
107+
108+
109+ auto width = _frameBufferSize.width() >> _AOResolutionLevel;
110+ auto height = _frameBufferSize.height() >> _AOResolutionLevel;
111+ auto colorFormat = gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGB);
112+ auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR);
113+ auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format
114+
115+ _occlusionTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
116+ _occlusionFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
117+ _occlusionFramebuffer->setRenderBuffer(0, _occlusionTexture);
118+ _occlusionFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
119+
120+ _occlusionBlurredTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, width, height, defaultSampler));
121+ _occlusionBlurredFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create());
122+ _occlusionBlurredFramebuffer->setRenderBuffer(0, _occlusionBlurredTexture);
123+ _occlusionBlurredFramebuffer->setDepthStencilBuffer(_primaryDepthTexture, depthFormat);
124+}
125+*/
126+
127+
128+gpu::TexturePointer DeferredFramebuffer::getPrimaryDepthTexture() {
129+ if (!_primaryDepthTexture) {
130+ allocate();
131+ }
132+ return _primaryDepthTexture;
133+}
134+
135+gpu::FramebufferPointer DeferredFramebuffer::getDeferredFramebuffer() {
136+ if (!_deferredFramebuffer) {
137+ allocate();
138+ }
139+ return _deferredFramebuffer;
140+}
141+
142+gpu::FramebufferPointer DeferredFramebuffer::getDeferredFramebufferDepthColor() {
143+ if (!_deferredFramebufferDepthColor) {
144+ allocate();
145+ }
146+ return _deferredFramebufferDepthColor;
147+}
148+
149+gpu::TexturePointer DeferredFramebuffer::getDeferredColorTexture() {
150+ if (!_deferredColorTexture) {
151+ allocate();
152+ }
153+ return _deferredColorTexture;
154+}
155+
156+gpu::TexturePointer DeferredFramebuffer::getDeferredNormalTexture() {
157+ if (!_deferredNormalTexture) {
158+ allocate();
159+ }
160+ return _deferredNormalTexture;
161+}
162+
163+gpu::TexturePointer DeferredFramebuffer::getDeferredSpecularTexture() {
164+ if (!_deferredSpecularTexture) {
165+ allocate();
166+ }
167+ return _deferredSpecularTexture;
168+}
169+
170+gpu::FramebufferPointer DeferredFramebuffer::getLightingFramebuffer() {
171+ if (!_lightingFramebuffer) {
172+ allocate();
173+ }
174+ return _lightingFramebuffer;
175+}
176+
177+gpu::TexturePointer DeferredFramebuffer::getLightingTexture() {
178+ if (!_lightingTexture) {
179+ allocate();
180+ }
181+ return _lightingTexture;
182+}