graphics::texture render_fbo(const rect& area, const std::vector<entity_ptr> objects) { const controls::control_backup_scope ctrl_backup; const int tex_width = graphics::texture::allows_npot() ? area.w() : graphics::texture::next_power_of_2(area.w()); const int tex_height = graphics::texture::allows_npot() ? area.h() : graphics::texture::next_power_of_2(area.h()); GLint video_framebuffer_id = 0; glGetIntegerv(EXT_MACRO(GL_FRAMEBUFFER_BINDING), &video_framebuffer_id); GLuint texture_id = 0; glGenTextures(1, &texture_id); glBindTexture(GL_TEXTURE_2D, texture_id); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); GLuint framebuffer_id = 0; EXT_CALL(glGenFramebuffers)(1, &framebuffer_id); EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), framebuffer_id); // attach the texture to FBO color attachment point EXT_CALL(glFramebufferTexture2D)(EXT_MACRO(GL_FRAMEBUFFER), EXT_MACRO(GL_COLOR_ATTACHMENT0), GL_TEXTURE_2D, texture_id, 0); // check FBO status GLenum status = EXT_CALL(glCheckFramebufferStatus)(EXT_MACRO(GL_FRAMEBUFFER)); ASSERT_NE(status, EXT_MACRO(GL_FRAMEBUFFER_UNSUPPORTED)); ASSERT_EQ(status, EXT_MACRO(GL_FRAMEBUFFER_COMPLETE)); glViewport(0, 0, area.w(), area.h()); level_ptr lvl(new level("empty.cfg")); foreach(const entity_ptr& e, objects) { lvl->add_character(e); lvl->add_draw_character(e); }
void set_render_to_screen() { EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), video_framebuffer_id); glViewport(0, 0, preferences::actual_screen_width(), preferences::actual_screen_height()); }
void set_render_to_texture() { EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), framebuffer_id); glViewport(0, 0, width(), height()); }
void init(int buffer_width, int buffer_height) { frame_buffer_texture_width = buffer_width; frame_buffer_texture_height = buffer_height; #if defined(TARGET_OS_HARMATTAN) || defined(TARGET_PANDORA) || defined(TARGET_TEGRA) || defined(TARGET_BLACKBERRY) if (glGenFramebuffersOES != NULL && glBindFramebufferOES != NULL && glFramebufferTexture2DOES != NULL && glCheckFramebufferStatusOES != NULL) { supported = true; } else { fprintf(stderr, "FRAME BUFFER OBJECT NOT SUPPORTED\n"); supported = false; return; } #elif !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR if(!GLEW_EXT_framebuffer_object) { fprintf(stderr, "FRAME BUFFER OBJECT NOT SUPPORTED\n"); supported = false; return; } #endif fprintf(stderr, "FRAME BUFFER OBJECT IS SUPPORTED\n"); #ifndef TARGET_TEGRA glGetIntegerv(EXT_MACRO(GL_FRAMEBUFFER_BINDING), &video_framebuffer_id); #endif ASSERT_EQ(glGetError(), GL_NO_ERROR); glGenTextures(1, &texture_id); glBindTexture(GL_TEXTURE_2D, texture_id); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_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); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width(), height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); // create a framebuffer object EXT_CALL(glGenFramebuffers)(1, &framebuffer_id); EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), framebuffer_id); // attach the texture to FBO color attachment point EXT_CALL(glFramebufferTexture2D)(EXT_MACRO(GL_FRAMEBUFFER), EXT_MACRO(GL_COLOR_ATTACHMENT0), GL_TEXTURE_2D, texture_id, 0); // check FBO status GLenum status = EXT_CALL(glCheckFramebufferStatus)(EXT_MACRO(GL_FRAMEBUFFER)); ASSERT_EQ(status, EXT_MACRO(GL_FRAMEBUFFER_COMPLETE)); // switch back to window-system-provided framebuffer EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), video_framebuffer_id); ASSERT_EQ(glGetError(), GL_NO_ERROR); }
render_scope::render_scope() { EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), framebuffer_id); glViewport(0, 0, width(), height()); }
void init(int buffer_width, int buffer_height) { // Clear any old errors. glGetError(); frame_buffer_texture_width = buffer_width; frame_buffer_texture_height = buffer_height; #if defined(__ANDROID__) { supported = false; LOG("FRAME BUFFER OBJECT NOT SUPPORTED"); return; } #endif #if defined(TARGET_OS_HARMATTAN) || defined(TARGET_PANDORA) || defined(TARGET_TEGRA) || defined(TARGET_BLACKBERRY) || defined(__ANDROID__) if (glGenFramebuffersOES != NULL && glBindFramebufferOES != NULL && glFramebufferTexture2DOES != NULL && glCheckFramebufferStatusOES != NULL) { supported = true; } else { fprintf(stderr, "FRAME BUFFER OBJECT NOT SUPPORTED\n"); supported = false; return; } #elif !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR if(!GLEW_EXT_framebuffer_object) { fprintf(stderr, "FRAME BUFFER OBJECT NOT SUPPORTED\n"); supported = false; return; } #endif fprintf(stderr, "FRAME BUFFER OBJECT IS SUPPORTED\n"); #ifndef TARGET_TEGRA glGetIntegerv(EXT_MACRO(GL_FRAMEBUFFER_BINDING), &video_framebuffer_id); #endif // Grab the error code first, because of the side effect in glGetError() of // clearing the error code and the double call in the ASSERT_EQ() macro we lose // the actual error code. GLenum err = glGetError(); ASSERT_EQ(err, GL_NO_ERROR); glGenTextures(1, &texture_id); glBindTexture(GL_TEXTURE_2D, texture_id); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_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); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width(), height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); // create a framebuffer object EXT_CALL(glGenFramebuffers)(1, &framebuffer_id); EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), framebuffer_id); // attach the texture to FBO color attachment point EXT_CALL(glFramebufferTexture2D)(EXT_MACRO(GL_FRAMEBUFFER), EXT_MACRO(GL_COLOR_ATTACHMENT0), GL_TEXTURE_2D, texture_id, 0); // check FBO status GLenum status = EXT_CALL(glCheckFramebufferStatus)(EXT_MACRO(GL_FRAMEBUFFER)); if(status == EXT_MACRO(GL_FRAMEBUFFER_UNSUPPORTED)) { std::cerr << "FRAME BUFFER OBJECT NOT SUPPORTED\n"; supported = false; err = glGetError(); } else { ASSERT_EQ(status, EXT_MACRO(GL_FRAMEBUFFER_COMPLETE)); } // switch back to window-system-provided framebuffer EXT_CALL(glBindFramebuffer)(EXT_MACRO(GL_FRAMEBUFFER), video_framebuffer_id); err = glGetError(); ASSERT_EQ(err, GL_NO_ERROR); }