void RenderTarget::fallbackRescale(int width, int height) { int mindim = width < height ? width : height; int origtexsize = this->texsize; this->texsize = nearestPower2( mindim, SCALE_MINIFY ); /* Create the texture that will be bound to the render this */ /* if ( this->texsize != origtexsize ) { glDeleteTextures( 1, &this->textureID[0] ); } */ glGenTextures(1, &this->textureID[0] ); glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->texsize, this->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); }
/** Creates new pbuffers */ RenderTarget::RenderTarget(int texsize, int width, int height) : useFBO(false) { int mindim = 0; int origtexsize = 0; this->renderToTexture = 0; this->texsize = texsize; #ifdef USE_FBO glewInit(); // Forceably disable FBO if user requested it but the video card / driver lacks // the appropraite frame buffer extension. if (useFBO = glewIsSupported("GL_EXT_framebuffer_object")) { GLuint fb, depth_rb, rgba_tex, other_tex; glGenFramebuffersEXT(1, &fb); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb ); glGenRenderbuffersEXT(1, &depth_rb); glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb ); glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb ); this->fbuffer[0] = fb; this->depthb[0]= depth_rb; glGenTextures(1, &other_tex); glBindTexture(GL_TEXTURE_2D,other_tex); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glGenTextures(1, &rgba_tex); glBindTexture(GL_TEXTURE_2D, rgba_tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0 ); this->textureID[0] = rgba_tex; this->textureID[1] = other_tex; GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { return; } std::cerr << "[projecM] warning: FBO support not detected. Using fallback." << std::endl; } #endif // Can reach here via two code paths: // (1) useFBO was set to false externally by cmake / system setting / etc. // (2) useFBO was true but forced to false as it failed to pass all the GLU extension checks. /** Fallback pbuffer creation via teximage hack */ /** Check the texture size against the viewport size */ /** If the viewport is smaller, then we'll need to scale the texture size down */ /** If the viewport is larger, scale it up */ mindim = width < height ? width : height; origtexsize = this->texsize; this->texsize = nearestPower2( mindim, SCALE_MINIFY ); glGenTextures(1, &this->textureID[0] ); glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->texsize, this->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); return; }
/** Creates new pbuffers */ RenderTarget::RenderTarget(int texsize, int width, int height, bool use_fbo) : useFBO(use_fbo) { int mindim = 0; int origtexsize = 0; this->renderToTexture = 0; this->useFBO = use_fbo; this->texsize = texsize; #ifdef USE_FBO if(this->useFBO) { //glewInit(); if(glewIsSupported("GL_EXT_framebuffer_object")) { GLuint fb, depth_rb, rgba_tex, other_tex; glGenFramebuffersEXT(1, &fb); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb ); glGenRenderbuffersEXT(1, &depth_rb); glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb ); glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->texsize,this->texsize ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb ); this->fbuffer[0] = fb; this->depthb[0]= depth_rb; glGenTextures(1, &other_tex); glBindTexture(GL_TEXTURE_2D,other_tex); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glGenTextures(1, &rgba_tex); glBindTexture(GL_TEXTURE_2D, rgba_tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0 ); this->textureID[0] = rgba_tex; this->textureID[1] = other_tex; GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { this->renderToTexture = 1; return; } } } this->useFBO=false; #else this->useFBO=false; #endif /** Fallback pbuf;fer creation via teximage hack */ /** Check the texture size against the viewport size */ /** If the viewport is smaller, then we'll need to scale the texture size down */ /** If the viewport is larger, scale it up */ mindim = width < height ? width : height; origtexsize = this->texsize; this->texsize = nearestPower2( mindim, SCALE_MINIFY ); this->texsize = origtexsize; // ^-- ok, texsize is just ignored with this glGenTextures(1, &this->textureID[0] ); glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->texsize, this->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); return; }