37 Bool_t TGLFBO::fgRescaleToPow2 = kTRUE;
38 Bool_t TGLFBO::fgMultiSampleNAWarned = kFALSE;
54 fMSCoverageSamples (0),
73 void TGLFBO::Init(
int w,
int h,
int ms_samples)
75 static const std::string eh(
"TGLFBO::Init ");
78 if (!GLEW_EXT_framebuffer_object)
80 throw std::runtime_error(eh +
"GL_EXT_framebuffer_object extension required for FBO.");
88 Int_t nw = 1 << TMath::CeilNint(TMath::Log2(w));
89 Int_t nh = 1 << TMath::CeilNint(TMath::Log2(h));
90 if (nw != w || nh != h)
92 fWScale = ((Float_t)w) / nw;
93 fHScale = ((Float_t)h) / nh;
99 if (ms_samples > 0 && ! GLEW_EXT_framebuffer_multisample)
101 if (!fgMultiSampleNAWarned)
103 Info(eh.c_str(),
"GL implementation does not support multi-sampling for FBOs.");
104 fgMultiSampleNAWarned = kTRUE;
109 if (fFrameBuffer != 0)
111 if (fW == w && fH == h && fMSSamples == ms_samples)
117 glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &maxSize);
118 if (w > maxSize || h > maxSize)
120 throw std::runtime_error(eh + Form(
"maximum size supported by GL implementation is %d.", maxSize));
123 fW = w; fH = h; fMSSamples = ms_samples;
127 if (GLEW_NV_framebuffer_multisample_coverage)
130 glGetIntegerv(GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV, &n_modes);
131 GLint *modes =
new GLint[2*n_modes];
132 glGetIntegerv(GL_MULTISAMPLE_COVERAGE_MODES_NV, modes);
134 for (
int i = 0; i < n_modes; ++i)
136 if (modes[i*2+1] == fMSSamples && modes[i*2] > fMSCoverageSamples)
137 fMSCoverageSamples = modes[i*2];
143 Info(eh.c_str(),
"InitMultiSample coverage_samples=%d, color_samples=%d.", fMSCoverageSamples, fMSSamples);
150 Info(eh.c_str(),
"InitStandard (no multi-sampling).");
155 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
157 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
158 glBindTexture (GL_TEXTURE_2D, 0);
162 case GL_FRAMEBUFFER_COMPLETE_EXT:
164 printf(
"%sConstructed TGLFBO ... all fine.\n", eh.c_str());
166 case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
168 throw std::runtime_error(eh +
"Constructed TGLFBO not supported, choose different formats.");
172 throw std::runtime_error(eh +
"Constructed TGLFBO is not complete, unexpected error.");
180 void TGLFBO::Release()
182 glDeleteFramebuffersEXT (1, &fFrameBuffer);
183 glDeleteRenderbuffersEXT(1, &fDepthBuffer);
185 if (fMSFrameBuffer) glDeleteFramebuffersEXT (1, &fMSFrameBuffer);
186 if (fMSColorBuffer) glDeleteRenderbuffersEXT(1, &fMSColorBuffer);
187 if (fColorTexture) glDeleteTextures (1, &fColorTexture);
189 fW = fH = -1; fMSSamples = fMSCoverageSamples = 0;
190 fFrameBuffer = fColorTexture = fDepthBuffer = fMSFrameBuffer = fMSColorBuffer = 0;
199 if (fMSSamples > 0) {
200 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fMSFrameBuffer);
207 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFrameBuffer);
214 void TGLFBO::Unbind()
218 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fMSFrameBuffer);
219 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fFrameBuffer);
220 glBlitFramebufferEXT(0, 0, fW, fH, 0, 0, fW, fH, GL_COLOR_BUFFER_BIT, GL_NEAREST);
223 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
229 void TGLFBO::BindTexture()
231 glPushAttrib(GL_TEXTURE_BIT);
232 glBindTexture(GL_TEXTURE_2D, fColorTexture);
233 glEnable(GL_TEXTURE_2D);
237 glMatrixMode(GL_TEXTURE);
239 glScalef(fWScale, fHScale, 1);
240 glMatrixMode(GL_MODELVIEW);
247 void TGLFBO::UnbindTexture()
251 glMatrixMode(GL_TEXTURE);
253 glMatrixMode(GL_MODELVIEW);
261 void TGLFBO::SetAsReadBuffer()
263 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fFrameBuffer);
270 void TGLFBO::InitStandard()
272 glGenFramebuffersEXT(1, &fFrameBuffer);
273 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFrameBuffer);
275 fDepthBuffer = CreateAndAttachRenderBuffer(GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
276 fColorTexture = CreateAndAttachColorTexture();
281 void TGLFBO::InitMultiSample()
283 glGenFramebuffersEXT(1, &fMSFrameBuffer);
284 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fMSFrameBuffer);
286 fMSColorBuffer = CreateAndAttachRenderBuffer(GL_RGBA8, GL_COLOR_ATTACHMENT0);
287 fDepthBuffer = CreateAndAttachRenderBuffer(GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
290 glGenFramebuffersEXT(1, &fFrameBuffer);
291 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fFrameBuffer);
293 fColorTexture = CreateAndAttachColorTexture();
298 UInt_t TGLFBO::CreateAndAttachRenderBuffer(Int_t format, Int_t type)
302 glGenRenderbuffersEXT(1, &
id);
303 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,
id);
307 if (fMSCoverageSamples > 0)
308 glRenderbufferStorageMultisampleCoverageNV(GL_RENDERBUFFER_EXT, fMSCoverageSamples, fMSSamples, format, fW, fH);
310 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, fMSSamples, format, fW, fH);
314 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, fW, fH);
317 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, type, GL_RENDERBUFFER_EXT,
id);
325 UInt_t TGLFBO::CreateAndAttachColorTexture()
329 glGenTextures(1, &
id);
331 glBindTexture(GL_TEXTURE_2D,
id);
332 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
333 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
334 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
335 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
336 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fW, fH, 0, GL_RGBA,
337 GL_UNSIGNED_BYTE, NULL);
339 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
340 GL_TEXTURE_2D,
id, 0);
348 Bool_t TGLFBO::GetRescaleToPow2()
350 return fgRescaleToPow2;
357 void TGLFBO::SetRescaleToPow2(Bool_t r)