Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool FBO::createFBO(const FBO::Config &c, FBO::Data &data) const {
- FBO::Config config(c);
- bool multisample = config._depthSamples > 0;
- bool csaa = config._coverageSamples > config._depthSamples;
- bool ret = true;
- int query;
- glGenFramebuffersEXT(1, &data.fb);
- ret &= checkFrameBufferStatus(true);
- glGenTextures(1, &data.tex);
- // init texture
- glBindTexture(GL_TEXTURE_2D, data.tex);
- glTexImage2D(GL_TEXTURE_2D, 0,
- config._colorFormat, _texWidth, _texHeight, 0,
- GL_RGB, GL_FLOAT, NULL);
- // glGenerateMipmapEXT( GL_TEXTURE_2D);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- //
- // Handle multisample FBO's first
- //
- if (multisample) {
- glGenRenderbuffersEXT( 1, &data.depthRB);
- glGenRenderbuffersEXT( 1, &data.colorRB);
- glGenFramebuffersEXT( 1, &data.resolveFB);
- data.depthTex = 0; //no resolve of depth buffer for now
- //multisample, so we need to resolve from the FBO, bind the texture to the resolve FBO
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, data.resolveFB);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, data.tex, 0);
- ret &= checkFrameBufferStatus(true);
- //now handle the rendering FBO
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, data.fb);
- // initialize color renderbuffer
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, data.colorRB);
- if (csaa) {
- glRenderbufferStorageMultisampleCoverageNV( GL_RENDERBUFFER_EXT, config._coverageSamples, config._depthSamples, config._colorFormat,
- _texWidth, _texHeight);
- glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COVERAGE_SAMPLES_NV, &query);
- if ( query < config._coverageSamples) {
- ret = false;
- }
- else if ( query > config._coverageSamples) {
- // report back the actual number
- config._coverageSamples = query;
- }
- glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COLOR_SAMPLES_NV, &query);
- if ( query < config._depthSamples) {
- ret = false;
- }
- else if ( query > config._depthSamples) {
- // report back the actual number
- config._depthSamples = query;
- }
- }
- else {
- // create a regular MSAA color buffer
- glRenderbufferStorageMultisampleEXT( GL_RENDERBUFFER_EXT, config._depthSamples, config._colorFormat, _texWidth, _texHeight);
- // check the number of samples
- glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &query);
- if ( query < config._depthSamples) {
- ret = false;
- }
- else if ( query > config._depthSamples) {
- config._depthSamples = query;
- }
- }
- // attach the multisampled color buffer
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, data.colorRB);
- ret &= checkFrameBufferStatus(true);
- // bind the multisampled depth buffer
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, data.depthRB);
- // create the multisampled depth buffer (with or without coverage sampling)
- if (csaa) {
- // create a coverage sampled MSAA depth buffer
- glRenderbufferStorageMultisampleCoverageNV( GL_RENDERBUFFER_EXT, config._coverageSamples, config._depthSamples, config._depthFormat,
- _texWidth, _texHeight);
- // check the number of coverage samples
- glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COVERAGE_SAMPLES_NV, &query);
- if ( query < config._coverageSamples) {
- ret = false;
- }
- else if ( query > config._coverageSamples) {
- // set the coverage samples value to return the actual value
- config._coverageSamples = query;
- }
- // cehck the number of stored color samples (same as depth samples)
- glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_COLOR_SAMPLES_NV, &query);
- if ( query < config._depthSamples) {
- ret = false;
- }
- else if ( query > config._depthSamples) {
- // set the depth samples value to return the actual value
- config._depthSamples = query;
- }
- }
- else {
- // create a regular (not coverage sampled) MSAA depth buffer
- glRenderbufferStorageMultisampleEXT( GL_RENDERBUFFER_EXT, config._depthSamples, config._depthFormat, _texWidth, _texHeight);
- // check the number of depth samples
- glGetRenderbufferParameterivEXT( GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_SAMPLES_EXT, &query);
- if ( query < config._depthSamples) {
- ret = false;
- }
- else if ( query < config._depthSamples) {
- config._depthSamples = query;
- }
- }
- // attach the depth buffer
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, data.depthRB);
- ret &= checkFrameBufferStatus(true);
- } // if (multisample)
- else {
- // glGenTextures( 1, &data.depthTex);
- // data.depthRB = 0;
- data.colorRB = 0;
- data.resolveFB = 0;
- //non-multisample, so bind things directly to the FBO
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, data.fb);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, data.tex, 0);
- /* glBindTexture( GL_TEXTURE_2D, data.depthTex);
- glTexImage2D( GL_TEXTURE_2D, 0, config._depthFormat, _texWidth, _texHeight, 0,
- GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameterf( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, data.depthTex, 0);
- */
- ret &= checkFrameBufferStatus(true);
- }
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, data.fb);
- /*glGetIntegerv( GL_RED_BITS, &query);
- if ( query != config.redbits) {
- ret = false;
- }*/
- /*glGetIntegerv( GL_DEPTH_BITS, &query);
- if ( query != config.depthBits) {
- ret = false;
- }*/
- if (multisample) {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, data.resolveFB);
- /* glGetIntegerv( GL_RED_BITS, &query);
- if ( query != config.redbits) {
- ret = false;
- }*/
- }
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- return ret;
- }
Add Comment
Please, Sign In to add comment