void GLES11RenderEngine::bindImageAsFramebuffer(EGLImageKHR image, uint32_t* texName, uint32_t* fbName, uint32_t* status, bool useReadPixels, int reqWidth, int reqHeight) { GLuint tname, name; if (!useReadPixels) { // turn our EGLImage into a texture glGenTextures(1, &tname); glBindTexture(GL_TEXTURE_2D, tname); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image); // create a Framebuffer Object to render into glGenFramebuffersOES(1, &name); glBindFramebufferOES(GL_FRAMEBUFFER_OES, name); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tname, 0); } else { // since we're going to use glReadPixels() anyways, // use an intermediate renderbuffer instead glGenRenderbuffersOES(1, &tname); glBindRenderbufferOES(GL_RENDERBUFFER_OES, tname); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, reqWidth, reqHeight); // create a FBO to render into glGenFramebuffersOES(1, &name); glBindFramebufferOES(GL_FRAMEBUFFER_OES, name); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, tname); } *status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); *texName = tname; *fbName = name; }
void RenderingEngine1::Initialize(int width, int height) { // Create the framebuffer object and attach the color buffer. glGenFramebuffersOES(1, &m_framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_renderbuffer); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); // Initialize the projection matrix. const float maxX = 2; const float maxY = 3; glOrthof(-maxX, +maxX, -maxY, +maxY, -1, 1); glMatrixMode(GL_MODELVIEW); // Initialize the rotation animation state. OnRotate(DeviceOrientationPortrait); m_currentAngle = m_desiredAngle; }
void OpenGLES1RenderManager::_generateOpenglBuffers() { #ifdef AURORA_IOS // Create & bind the color buffer so that the caller can allocate its space. glGenRenderbuffersOES(1, &m_colorRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); // Create the depth buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES,GL_DEPTH_COMPONENT16_OES,_width,_height); // Create the framebuffer object; attach the depth and color buffers. glGenFramebuffersOES(1, &m_framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); // Bind the color buffer for rendering. glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); #endif }
void CreateSurfaceGLES(EAGLSurfaceDesc* surface) { GLuint oldRenderbuffer; GLES_CHK( glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, (GLint *) &oldRenderbuffer) ); DestroySurfaceGLES(surface); InitEAGLLayer(surface->eaglLayer, surface->use32bitColor); GLES_CHK( glGenRenderbuffersOES(1, &surface->renderbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer) ); if( !AllocateRenderBufferStorageFromEAGLLayer(surface->eaglLayer) ) { GLES_CHK( glDeleteRenderbuffersOES(1, &surface->renderbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_BINDING_OES, oldRenderbuffer) ); printf_console("FAILED allocating render buffer storage from gles context\n"); return; } GLES_CHK( glGenFramebuffersOES(1, &surface->framebuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); gDefaultFBO = surface->framebuffer; UNITY_DBG_LOG ("glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, %d) :: AppCtrl\n", surface->renderbuffer); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, surface->renderbuffer) ); CreateSurfaceMultisampleBuffersGLES(surface); }
inline void VL_glGenFramebuffers(GLsizei n, GLuint *framebuffers) { if (glGenFramebuffersOES) glGenFramebuffersOES(n, framebuffers); else VL_TRAP(); }
// src서피스를 this로 카피. void XSurfaceOpenGL::CopySurface( XSurface *src ) { XSurfaceOpenGL *pSrc = (XSurfaceOpenGL *)src; // src를 FBO에 연결 // glCopyTexImage를 이용해 src에서 this로 옮김. GLuint fbo; glGenFramebuffersOES(1, &fbo); glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, pSrc->GetTextureID(), 0); GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); if( status != GL_FRAMEBUFFER_COMPLETE_OES ) { XLOG( "status=%d", status ); return; } // copy texture from framebuffer glBindTexture(GL_TEXTURE_2D, m_textureID); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, pSrc->GetMemWidth(), pSrc->GetMemHeight()); // FBO해제 GRAPHICS_GL->RestoreFrameBuffer(); glDeleteFramebuffersOES(1, &fbo); }
void Screen::CreateHardwareSurfaces() { glGenFramebuffersOES(1, &frameBuffer); glGenRenderbuffersOES(1, &renderBuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderBuffer); iphPrepareGLContext(); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, renderBuffer); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &iWidth); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &iHeight); #if SEED_ENABLE_DEPTH_TEST glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, iWidth, iHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); #endif // SEED_ENABLE_DEPTH_TEST if (iMode == LANDSCAPE || iMode == LANDSCAPE_GOOFY) { this->iModeWidth = this->iHeight; this->iModeHeight = this->iWidth; } else { this->iModeWidth = this->iHeight; this->iModeHeight = this->iWidth; } }
void wyRenderTexture::createFrameBuffer(int w, int h) { // create texture glGenTextures(1, (GLuint*)&m_texture); glBindTexture(GL_TEXTURE_2D, m_texture); // apply texture parameters glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // allocate buffer and create texture from it GLvoid* pixels = (GLvoid*)wyCalloc(w * h * 4, sizeof(GLubyte)); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); wyFree(pixels); // generate a new frame buffer glGenFramebuffersOES(1, (GLuint*)&m_fbo); // get old frame buffer object glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint*)&m_old_fbo); // bind glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_fbo); // associate texture with FBO glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, m_texture, 0); // restore old buffer glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_old_fbo); }
GLESFBOManager::GLESFBOManager() : mTempFBO(0) { detectFBOFormats(); glGenFramebuffersOES(1, &mTempFBO); GL_CHECK_ERROR; }
void GLESFBOManager::_reload() { glDeleteFramebuffersOES(1, &mTempFBO); GL_CHECK_ERROR; detectFBOFormats(); glGenFramebuffersOES(1, &mTempFBO); GL_CHECK_ERROR; }
void CreateSurfaceMultisampleBuffersGLES(EAGLSurfaceDesc* surface) { UNITY_DBG_LOG ("CreateSurfaceMultisampleBuffers: samples=%i\n", surface->msaaSamples); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); gDefaultFBO = surface->framebuffer; DestroySurfaceMultisampleBuffersGLES(surface); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); #if GL_APPLE_framebuffer_multisample if(surface->msaaSamples > 1) { GLES_CHK( glGenRenderbuffersOES(1, &surface->msaaRenderbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->msaaRenderbuffer) ); GLES_CHK( glGenFramebuffersOES(1, &surface->msaaFramebuffer) ); UNITY_DBG_LOG ("glBindFramebufferOES(GL_FRAMEBUFFER_OES, %d) :: AppCtrl\n", surface->msaaFramebuffer); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->msaaFramebuffer) ); gDefaultFBO = surface->msaaFramebuffer; GLES_CHK( glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, surface->msaaSamples, surface->format, surface->w, surface->h) ); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, surface->msaaRenderbuffer) ); if(surface->depthFormat) { GLES_CHK( glGenRenderbuffersOES(1, &surface->msaaDepthbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->msaaDepthbuffer) ); GLES_CHK( glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, surface->msaaSamples, GL_DEPTH_COMPONENT16_OES, surface->w, surface->h) ); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, surface->msaaDepthbuffer) ); } } else #endif { if(surface->depthFormat) { GLES_CHK( glGenRenderbuffersOES(1, &surface->depthbuffer) ); GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->depthbuffer) ); GLES_CHK( glRenderbufferStorageOES(GL_RENDERBUFFER_OES, surface->depthFormat, surface->w, surface->h) ); UNITY_DBG_LOG ("glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, %d) :: AppCtrl\n", surface->depthbuffer); GLES_CHK( glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, surface->depthbuffer) ); } } }
void RenderES1::setViewPort(int width, int height) { glGenRenderbuffersOES(1, &_render_buffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, _render_buffer); // glGenFramebuffersOES(1, &_frame_buffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, _frame_buffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _render_buffer); glViewport(0, 0, width, height); }
//----------------------------------------------------------------------------- GLESFrameBufferObject::GLESFrameBufferObject(GLESFBOManager *manager, uint fsaa): mManager(manager), mNumSamples(fsaa) { /// Generate framebuffer object glGenFramebuffersOES(1, &mFB); GL_CHECK_ERROR; // Check multisampling #if GL_APPLE_framebuffer_multisample // Check samples supported glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFB); GL_CHECK_ERROR; GLint maxSamples; glGetIntegerv(GL_MAX_SAMPLES_APPLE, &maxSamples); GL_CHECK_ERROR; glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); GL_CHECK_ERROR; mNumSamples = std::min(mNumSamples, (GLsizei)maxSamples); #else mNumSamples = 0; #endif // will we need a second FBO to do multisampling? if (mNumSamples) { glGenFramebuffersOES(1, &mMultisampleFB); GL_CHECK_ERROR; } else { mMultisampleFB = 0; } /// Initialise state mDepth.buffer=0; mStencil.buffer=0; for(size_t x=0; x<OGRE_MAX_MULTIPLE_RENDER_TARGETS; ++x) { mColour[x].buffer=0; } }
void EJCanvasContext::create() { #ifdef _WINDOWS if( msaaEnabled ) { glGenFramebuffersEXT(1, &msaaFrameBuffer); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, msaaFrameBuffer); glGenRenderbuffersEXT(1, &msaaRenderBuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, msaaRenderBuffer); //glRenderbufferStorageMultisampleIMG(GL_RENDERBUFFER, msaaSamples, GL_RGBA8, bufferWidth, bufferHeight); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER_EXT, msaaRenderBuffer); } glGenFramebuffersEXT(1, &viewFrameBuffer); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, viewFrameBuffer); glGenRenderbuffersEXT(1, &viewRenderBuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, viewRenderBuffer); #else if( msaaEnabled ) { glGenFramebuffersOES(1, &msaaFrameBuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, msaaFrameBuffer); glGenRenderbuffersOES(1, &msaaRenderBuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaRenderBuffer); //glRenderbufferStorageMultisampleIMG(GL_RENDERBUFFER_OES, msaaSamples, GL_RGBA8_OES, bufferWidth, bufferHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, msaaRenderBuffer); } glGenFramebuffersOES(1, &viewFrameBuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFrameBuffer); glGenRenderbuffersOES(1, &viewRenderBuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderBuffer); #endif }
void GLESFrameBufferObject::notifyOnContextReset(const GLESSurfaceDesc &target) { /// Generate framebuffer object glGenFramebuffersOES(1, &mFB); GL_CHECK_ERROR; glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFB); GL_CHECK_ERROR; // Bind target to surface 0 and initialise bindSurface(0, target); GL_CHECK_ERROR; }
void RenderingEngine1::initialize(int width, int height){ glGenFramebuffersOES(1, &frameBuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, renderBuffer); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); const float maxX = 2; const float maxY = 3; glOrthof(-maxX, +maxX, -maxY, +maxY, -1, 1); glMatrixMode(GL_MODELVIEW); }
void sgTexture::makeRendertarget() { if(textype != GL_TEXTURE_2D || fbo != -1) return; if(sgRenderer::oglversion > 1) { #if defined __IOS__ glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glBindTexture(textype, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texid, 0); glClear(GL_COLOR_BUFFER_BIT); glGenRenderbuffers(1, &fbo_depth); glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth); // glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, width, height); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth); #else glGenFramebuffersEXT(1, &fbo); glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); glBindTexture(textype, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texid, 0); glClear(GL_COLOR_BUFFER_BIT); glGenRenderbuffersEXT(1, &fbo_depth); glBindRenderbufferEXT(GL_RENDERBUFFER, fbo_depth); // glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, width, height); glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth); #endif }else { #if defined __IOS__ glGenFramebuffersOES(1, &fbo); glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texid, 0); glGenRenderbuffersOES(1, &fbo_depth); glBindRenderbufferOES(GL_RENDERBUFFER_OES, fbo_depth); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, fbo_depth); #endif } }
void RenderingEngine1::Initialize(int width, int height) { glGenFramebuffersOES(1, &_frameBuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, _frameBuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _renderBuffer); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); const float maxX = 2; const float maxY = 3; glOrthof(-maxX, +maxX, -maxY, +maxY, -1, 1); glMatrixMode(GL_MODELVIEW); OnRotate(DeviceOrientationPortrait); _currentAngle = _desiredAngle; }
void GLES11RenderEngine::bindImageAsFramebuffer(EGLImageKHR image, uint32_t* texName, uint32_t* fbName, uint32_t* status) { GLuint tname, name; // turn our EGLImage into a texture glGenTextures(1, &tname); glBindTexture(GL_TEXTURE_2D, tname); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image); // create a Framebuffer Object to render into glGenFramebuffersOES(1, &name); glBindFramebufferOES(GL_FRAMEBUFFER_OES, name); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tname, 0); *status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); *texName = tname; *fbName = name; }
FBO *createFBO(s32 width, s32 height, bool hd) { // save current FBO FBO *oldFBO = getFBOUsed(); GLuint framebuffer; GLuint depthRenderbuffer; width = width; height = height; s32 texturePtrId = createTexture(0, 0); setTexture(texturePtrId, width, height, 3, NULL); Texture *tex = getTexture(texturePtrId); // create depth renderbuffer glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); // bind framebuffer & attach texture glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tex->mTextureId, 0); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); // check binding if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { logError(TAG, "CRITICAL ERROR: FBO no complete"); return 0; } // save info into structure FBO *fbo = (FBO *)malloc(sizeof(FBO)); fbo->mFBO = framebuffer; fbo->mWidth = width; fbo->mHeight = height; fbo->mTexturePtrId = texturePtrId; fbo->mDepthRenderBuffer = depthRenderbuffer; // restore FBO useFBO(oldFBO); return fbo; }
GLES_FBOList * GLES_GetFBO(GLES_RenderData *data, Uint32 w, Uint32 h) { GLES_FBOList *result = data->framebuffers; while ((result) && ((result->w != w) || (result->h != h)) ) { result = result->next; } if (result == NULL) { result = SDL_malloc(sizeof(GLES_FBOList)); result->w = w; result->h = h; glGenFramebuffersOES(1, &result->FBO); result->next = data->framebuffers; data->framebuffers = result; } return result; }
OpenGLRTTexture::OpenGLRTTexture(unsigned int _texture, int width, int height) : mTextureID(_texture), mWidth(width), mHeight(height), mFBOID(0), mRBOID(0) { int miplevel = 0; glBindTexture(GL_TEXTURE_2D, mTextureID); //glGetTexLevelParameteriv(GL_TEXTURE_2D, miplevel, GL_TEXTURE_WIDTH, &mWidth); // Unsupported by OpenGL ES, using param //glGetTexLevelParameteriv(GL_TEXTURE_2D, miplevel, GL_TEXTURE_HEIGHT, &mHeight); // Unsupported by OpenGL ES, using param glBindTexture(GL_TEXTURE_2D, 0); mRenderTargetInfo.maximumDepth = 1.0f; mRenderTargetInfo.hOffset = 0; mRenderTargetInfo.vOffset = 0; mRenderTargetInfo.aspectCoef = float(mHeight) / float(mWidth); mRenderTargetInfo.pixScaleX = 1.0f / float(mWidth); mRenderTargetInfo.pixScaleY = 1.0f / float(mHeight); // create a framebuffer object, you need to delete them when program exits. glGenFramebuffersOES(1, &mFBOID); glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFBOID); // create a renderbuffer object to store depth info // NOTE: A depth renderable image should be attached the FBO for depth test. // If we don't attach a depth renderable image to the FBO, then // the rendering output will be corrupted because of missing depth test. // If you also need stencil test for your rendering, then you must // attach additional image to the stencil attachement point, too. glGenRenderbuffersOES(1, &mRBOID); glBindRenderbufferOES(GL_RENDERBUFFER_OES, mRBOID); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, mWidth, mHeight); glBindRenderbufferOES(GL_RENDERBUFFER_OES, 0); // attach a texture to FBO color attachement point glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, mTextureID, 0); // attach a renderbuffer to depth attachment point glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, mRBOID); glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); }
extern int hdglGenTextureFrameBuffer(const hdTexture *texture) { GLuint fbo, status; glGenFramebuffersOES(1, &fbo); glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture->texnum, 0); status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); if (status != GL_FRAMEBUFFER_COMPLETE_OES) { hdPrintf("Could not create frame buffer."); return -1; } else { return fbo; } }
virtual GLenum createFBO(GLuint& framebuffer, GLuint& depthbuffer, GLuint& img, int width, int height) { // get currently bound fbo to reset to it later GLint current_fbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, ¤t_fbo); // generate depth buffer glGenRenderbuffersOES(1, &depthbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); glBindRenderbufferOES(GL_RENDERBUFFER_OES, 0); // generate texture save target glGenTextures(1, &img); glBindTexture(GL_TEXTURE_2D, img); 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); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_OES, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glBindTexture(GL_TEXTURE_2D, 0); // create framebuffer glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, img, 0); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthbuffer); GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); // unbind framebuffer glBindFramebufferOES(GL_FRAMEBUFFER_OES, (GLuint)current_fbo); return status; }
void TextureGPU::createDrawableIntoColorTextureWithDepth(PrimitiveTypes::UInt32 w, PrimitiveTypes::UInt32 h, ESamplerState sampler, bool use32BitRedForDepth /* = false*/) { StringOps::writeToString("createDrawableIntoColorTextureWithDepth", m_name, 256); m_samplerState = sampler; # if APIABSTRACTION_D3D9 D3D9Renderer *pD3D9Renderer = static_cast<D3D9Renderer *>(m_pContext->getGPUScreen()); LPDIRECT3DDEVICE9 pDevice = pD3D9Renderer->m_pD3D9Device; m_viewport.X = 0; m_viewport.Y = 0; m_viewport.Width = w; m_viewport.Height = h; m_viewport.MinZ = 0.0f; m_viewport.MaxZ = 1.0f; #if APIABSTRACTION_X360 HRESULT hr = D3DXCreateTexture(pDevice, w, h, 1, D3DUSAGE_RENDERTARGET, use32BitRedForDepth ? D3DFMT_R32F : D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &this->m_pTexture ); #else HRESULT hr = pDevice->CreateTexture( w, h, 1, D3DUSAGE_RENDERTARGET, use32BitRedForDepth ? D3DFMT_R32F : D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &this->m_pTexture, NULL); #endif D3DSURFACE_DESC desc; m_pTexture->GetSurfaceLevel( 0, &m_pSurface ); m_pSurface->GetDesc( &desc ); #ifdef _XBOX //create depth stencil surface to use with this texture hr = pDevice->CreateDepthStencilSurface( w, h, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, // multi sample quality TRUE, // Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise. //If this flag is set, the contents of the depth stencil buffer will be invalid // after calling either IDirect3DDevice9::Present or IDirect3DDevice9::SetDepthStencilSurface with a different depth surface. &m_pEDRamDSRenderTargetSurface, NULL); assert(SUCCEEDED(hr)); hr = pDevice->CreateRenderTarget( desc.Width, desc.Height, ( D3DFORMAT )MAKESRGBFMT( desc.Format ), D3DMULTISAMPLE_NONE, 0, 0, &m_pEDRamColorRenderTargetSurface, NULL ); #else #if D3D9_USE_RENDER_TO_SURFACE hr = D3DXCreateRenderToSurface(pDevice, desc.Width, desc.Height, desc.Format, TRUE, D3DFMT_D16, &m_pRenderToSurface ); #else //create depth stencil surface to use with this texture hr = pDevice->CreateDepthStencilSurface( w, h, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, // multi sample quality TRUE, // Set this flag to TRUE to enable z-buffer discarding, and FALSE otherwise. //If this flag is set, the contents of the depth stencil buffer will be invalid // after calling either IDirect3DDevice9::Present or IDirect3DDevice9::SetDepthStencilSurface with a different depth surface. &m_pDSSurface, NULL); #endif #endif assert(SUCCEEDED(hr)); #elif APIABSTRACTION_OGL SamplerState &ss = SamplerStateManager::getInstance()->getSamplerState(m_samplerState); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); IRenderer::checkForErrors("glTexImage2D"); #if PE_PLAT_IS_IOS PEWARN("We are creating depth texture as 32 bit, because I could not get 16 bit depth working. If you figure it out, change it to 16 bit for better perf (hopefully!)"); #endif glTexImage2D( GL_TEXTURE_2D, // Target 0, // Mip-level #if PE_PLAT_IS_IOS GL_DEPTH_COMPONENT, // InternalFormat #else GL_DEPTH_COMPONENT16, #endif w, // width size h, // height size 0, // border GL_DEPTH_COMPONENT, // input pixel format #if PE_PLAT_IS_IOS GL_UNSIGNED_INT, // input pixel type #else GL_UNSIGNED_SHORT, #endif NULL); // input pixels IRenderer::checkForErrors("glTexImage2D"); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, ss.val_GL_TEXTURE_MIN_FILTER); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, ss.val_GL_TEXTURE_MAG_FILTER); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, ss.val_GL_TEXTURE_WRAP_S); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, ss.val_GL_TEXTURE_WRAP_T); #if !APIABSTRACTION_IOS glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,0); //only one mip // depth related comparison functions glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); #endif glBindTexture(GL_TEXTURE_2D, 0); #if APIABSTRACTION_PS3 glGenFramebuffersOES(1, &m_frameBufferObject); #else glGenFramebuffers(1, &m_frameBufferObject); #endif #if APIABSTRACTION_PS3 glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBufferObject); //set framebuffer for reading and writing. could also use GL_READ_FRAMEBUFFER to set a buffer for reading vs writing. #else glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferObject); //set framebuffer for reading and writing. could also use GL_READ_FRAMEBUFFER to set a buffer for reading vs writing. #endif //glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, w); / no need for this, since it take size of the texture passed #if APIABSTRACTION_PS3 glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_TEXTURE_2D, texture, 0); #else glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture, 0); #endif m_viewport.x = 0; m_viewport.y = 0; m_viewport.w = w; m_viewport.h = h; m_viewport.minDepth = 0; m_viewport.maxDepth = 1.0f; // had to comment out this assert becasue apparently with newest hardware it is actually complete too //assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE); // make sure API requires color texture too // need to cerate color texture too, otherwise framebuffer object is incomplete glGenTextures(1, &m_texture); glBindTexture(GL_TEXTURE_2D, m_texture); IRenderer::checkForErrors("glTexImage2D"); #if PE_PLAT_IS_IOS if (use32BitRedForDepth) PEWARN("We are creating depth+color and storing dpeth in color. for ios we store it as rgba, since we cant store it as 32bit red.."); #endif glTexImage2D( GL_TEXTURE_2D, // Target 0, // Mip-level #if defined(SN_TARGET_PS3) use32BitRedForDepth ? GL_LUMINANCE32F_ARB : GL_ARGB_SCE, #else #if APIABSTRACTION_IOS use32BitRedForDepth ? GL_RGBA : GL_RGBA, // InternalFormat, for ps3 use GL_ARGB_SCE, why? #else use32BitRedForDepth ? GL_R32F : GL_RGBA, // InternalFormat, for ps3 use GL_ARGB_SCE, why? #endif #endif w, // width size h, // height size 0, // border GL_RGBA, // input pixel format GL_UNSIGNED_BYTE, // input pixel type NULL); // input pixels IRenderer::checkForErrors("glTexImage2D"); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, ss.val_GL_TEXTURE_MIN_FILTER); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, ss.val_GL_TEXTURE_MAG_FILTER); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, ss.val_GL_TEXTURE_WRAP_S); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, ss.val_GL_TEXTURE_WRAP_T); #if !APIABSTRACTION_IOS glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,0); //only one mip #endif //depth related //glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_MODE_ARB,GL_COMPARE_R_TO_TEXTURE_ARB); //glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); glBindTexture(GL_TEXTURE_2D, 0); #if APIABSTRACTION_PS3 glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_texture, 0); #else glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture, 0); #endif #if !APIABSTRACTION_IOS #if APIABSTRACTION_PS3 assert(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) == GL_FRAMEBUFFER_COMPLETE_OES); #else assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); #endif #endif IRenderer::checkRenderBufferComplete(); #if APIABSTRACTION_PS3 glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); // back to default #else glBindFramebuffer(GL_FRAMEBUFFER, 0); // back to default #endif #elif APIABSTRACTION_D3D11 m_viewport.TopLeftX = 0; m_viewport.TopLeftY = 0; m_viewport.Width = w; m_viewport.Height = h; m_viewport.MinDepth = 0.0f; m_viewport.MaxDepth = 1.0f; D3D11Renderer *pD3D11Renderer = static_cast<D3D11Renderer *>(m_pContext->getGPUScreen()); ID3D11Device *pDevice = pD3D11Renderer->m_pD3DDevice; ID3D11DeviceContext *pDeviceContext = pD3D11Renderer->m_pD3DContext; //ID3D11Texture2D *pColorMap = 0; D3D11_TEXTURE2D_DESC texDesc; texDesc.Width = w; texDesc.Height = h; texDesc.MipLevels = 1; texDesc.ArraySize = 1; texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; texDesc.SampleDesc.Count = 1; texDesc.SampleDesc.Quality = 0; texDesc.Usage = D3D11_USAGE_DEFAULT; texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; texDesc.CPUAccessFlags = 0; texDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS; HRESULT hr = pDevice->CreateTexture2D(&texDesc, 0, &m_pTexture); assert(SUCCEEDED(hr)); // Null description means to create a view to all mipmap levels // using the format the texture was created with hr = pDevice->CreateRenderTargetView(m_pTexture, 0, &m_pRenderTargetView); assert(SUCCEEDED(hr)); hr = pDevice->CreateShaderResourceView(m_pTexture, 0, &m_pShaderResourceView); assert(SUCCEEDED(hr)); // Now create depth part fo the texture ID3D11Texture2D *pDepthMap = 0; texDesc.Format = DXGI_FORMAT_R32_TYPELESS; texDesc.Usage = D3D11_USAGE_DEFAULT; texDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; texDesc.CPUAccessFlags = 0; texDesc.MiscFlags = 0; hr = pDevice->CreateTexture2D(&texDesc, 0, &pDepthMap); assert(SUCCEEDED(hr)); // setting up view for rendering into depth buffer/and reading (stenciling) from it (z-buffer algorithm red/write) D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; dsvDesc.Format = DXGI_FORMAT_D32_FLOAT; dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; dsvDesc.Texture2D.MipSlice = 0; dsvDesc.Flags = 0;//D3D11_DSV_READ_ONLY_DEPTH; hr = pDevice->CreateDepthStencilView(pDepthMap, &dsvDesc, &m_DepthStencilView); assert(SUCCEEDED(hr)); D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; srvDesc.Format = DXGI_FORMAT_R32_FLOAT; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MipLevels = texDesc.MipLevels; srvDesc.Texture2D.MostDetailedMip = 0; hr = pDevice->CreateShaderResourceView(pDepthMap, &srvDesc, &m_pDepthShaderResourceView); assert(SUCCEEDED(hr)); pDepthMap->Release(); #endif }
status_t SurfaceFlinger::captureScreenImplLocked(DisplayID dpy, sp<IMemoryHeap>* heap, uint32_t* w, uint32_t* h, PixelFormat* f, uint32_t sw, uint32_t sh) { LOGI("captureScreenImplLocked"); status_t result = PERMISSION_DENIED; // only one display supported for now if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT)) return BAD_VALUE; if (!GLExtensions::getInstance().haveFramebufferObject()) return INVALID_OPERATION; // get screen geometry const DisplayHardware& hw(graphicPlane(dpy).displayHardware()); const uint32_t hw_w = hw.getWidth(); const uint32_t hw_h = hw.getHeight(); if ((sw > hw_w) || (sh > hw_h)) return BAD_VALUE; sw = (!sw) ? hw_w : sw; sh = (!sh) ? hw_h : sh; const size_t size = sw * sh * 4; // make sure to clear all GL error flags while ( glGetError() != GL_NO_ERROR ) ; // create a FBO GLuint name, tname; glGenRenderbuffersOES(1, &tname); glBindRenderbufferOES(GL_RENDERBUFFER_OES, tname); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, sw, sh); glGenFramebuffersOES(1, &name); glBindFramebufferOES(GL_FRAMEBUFFER_OES, name); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, tname); GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); if (status == GL_FRAMEBUFFER_COMPLETE_OES) { // invert everything, b/c glReadPixel() below will invert the FB glViewport(0, 0, sw, sh); glScissor(0, 0, sw, sh); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrthof(0, hw_w, 0, hw_h, 0, 1); glMatrixMode(GL_MODELVIEW); // redraw the screen entirely... glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT); const Vector< sp<LayerBase> >& layers(mVisibleLayersSortedByZ); const size_t count = layers.size(); for (size_t i=0 ; i<count ; ++i) { const sp<LayerBase>& layer(layers[i]); layer->drawForSreenShot(); } // XXX: this is needed on tegra glScissor(0, 0, sw, sh); // check for errors and return screen capture if (glGetError() != GL_NO_ERROR) { // error while rendering result = INVALID_OPERATION; } else { // allocate shared memory large enough to hold the // screen capture sp<MemoryHeapBase> base( new MemoryHeapBase(size, 0, "screen-capture") ); void* const ptr = base->getBase(); if (ptr) { // capture the screen with glReadPixels() glReadPixels(0, 0, sw, sh, GL_RGBA, GL_UNSIGNED_BYTE, ptr); if (glGetError() == GL_NO_ERROR) { *heap = base; *w = sw; *h = sh; *f = PIXEL_FORMAT_RGBA_8888; result = NO_ERROR; } } else { result = NO_MEMORY; } } glEnable(GL_SCISSOR_TEST); glViewport(0, 0, hw_w, hw_h); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } else { result = BAD_VALUE; } // release FBO resources glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); glDeleteRenderbuffersOES(1, &tname); glDeleteFramebuffersOES(1, &name); hw.compositionComplete(); return result; }
void RenderingEngine::Initialize(const vector<ISurface*>& surfaces) { vector<ISurface*>::const_iterator surface; for (surface = surfaces.begin(); surface != surfaces.end(); ++surface) { // Create the VBO for the vertices. vector<float> vertices; unsigned char vertexFlags = VertexFlagsNormals | VertexFlagsTexCoords; (*surface)->GenerateVertices(vertices, vertexFlags); GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a new VBO for the indices if needed. int indexCount = (*surface)->GetTriangleIndexCount(); GLuint indexBuffer; if (!m_drawables.empty() && indexCount == m_drawables[0].IndexCount) { indexBuffer = m_drawables[0].IndexBuffer; } else { vector<GLushort> indices(indexCount); (*surface)->GenerateTriangleIndices(indices); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), &indices[0], GL_STATIC_DRAW); } Drawable drawable = { vertexBuffer, indexBuffer, indexCount}; m_drawables.push_back(drawable); } // Extract width and height from the color buffer. int width, height; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height); // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); // Create the framebuffer object. GLuint framebuffer; glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); void* pixels; ivec2 size; // Load the background texture. glGenTextures(1, &m_backgroundTexture); glBindTexture(GL_TEXTURE_2D, m_backgroundTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager->LoadPngImage("Background"); pixels = m_resourceManager->GetImageData(); size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Load the checkboard texture. glGenTextures(1, &m_gridTexture); glBindTexture(GL_TEXTURE_2D, m_gridTexture); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); m_resourceManager->LoadPngImage("Checkerboard"); pixels = m_resourceManager->GetImageData(); size = m_resourceManager->GetImageSize(); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, size.x, size.y, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels); m_resourceManager->UnloadImage(); // Set up various GL state. glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); // Set up the material properties. vec4 specular(0.5f, 0.5f, 0.5f, 1); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular.Pointer()); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0f); m_translation = mat4::Translate(0, 0, -7); }
void glGenFramebuffersOESLogged(GLsizei n, GLuint* framebuffers) { printf("glGenFramebuffersOES(%i, %p)\n", n, framebuffers); glGenFramebuffersOES(n, framebuffers); }
int createFrameBuffer(AndroidContext *rc) { int backingWidth; int backingHeight; int res; if ( rc->framebuff >= 0 ) releaseFrameBuffer(rc); LOG( ANDROID_LOG_DEBUG, TAG, "Android Create FrameBuffer")); glGenFramebuffersOES(1, &(rc->framebuff)); glBindFramebufferOES(GL_FRAMEBUFFER_OES, rc->framebuff); // glGenRenderbuffersOES(1, &(rc->depthbuff)); // glBindRenderbufferOES(GL_RENDERBUFFER_OES, rc->depthbuff); // glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); // glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); // LOG( ANDROID_LOG_ERROR, TAG, "Android Depth Buffer Size: %dx%d\n", backingWidth, backingHeight)); // glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, rc->width, rc->height); // glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, // GL_RENDERBUFFER_OES, rc->depthbuff); glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, rc->texID, 0); if ( (res=(int)glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)) != GL_FRAMEBUFFER_COMPLETE_OES ) { LOG( ANDROID_LOG_ERROR, TAG, "Android failed to make complete framebuffer object:"); switch (res) { case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES: LOG( ANDROID_LOG_ERROR, TAG, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES"); break; case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES: LOG( ANDROID_LOG_ERROR, TAG, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES"); break; case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES: LOG( ANDROID_LOG_ERROR, TAG, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES"); break; case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES: LOG( ANDROID_LOG_ERROR, TAG, "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES"); break; case GL_FRAMEBUFFER_UNSUPPORTED_OES: LOG( ANDROID_LOG_ERROR, TAG, "GL_FRAMEBUFFER_UNSUPPORTED_OES"); break; default : LOG( ANDROID_LOG_ERROR, TAG, "Unknown error: %d", res); break; } return 1; } //glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); return 0; }
void ofxFBOTexture::allocate(int w, int h, int internalGlDataType, int numSamples) { _isActive = false; //OpenGL supported technologies checking. if(!bSupportsFBO){ ofLog(OF_LOG_ERROR, "ofxFBOTexture: GL_EXT_framebuffer_object not supported by current OpenGL renderer. " " For Apple machines, more info at http://developer.apple.com/graphicsimaging/opengl/capabilities"); return; } if(!bSupportsMulti && numSamples){ ofLog(OF_LOG_WARNING, "ofxFBOTexture: GL_EXT_framebuffer_multisample not supported by current OpenGL renderer." " Falling back to non-multisampled mode. To disable this message, specify 0 samples." " Apple machines, more info at http://developer.apple.com/graphicsimaging/opengl/capabilities"); numSamples = 0; } if(!bSupportsBlit && numSamples){ //if there's no blit, then it's not worth using multi ofLog(OF_LOG_WARNING, "ofxFBOTexture: GL_EXT_framebuffer_blit not supported by current OpenGL renderer." " Falling back to non-multisampled mode. To disable this message, specify 0 samples." " Apple machines, more info at http://developer.apple.com/graphicsimaging/opengl/capabilities"); numSamples = 0; } if(maxSamples < numSamples){ ofLog(OF_LOG_WARNING, "ofxFBOTexture: requested samples too high. Using GL_SAMPLES instead."); numSamples = maxSamples; } //validate requested dimensions to see that they are within limits. if(maxTextureSize < w || maxRenderBufferSize < w){ ofLog(OF_LOG_WARNING, "ofxFBOTexture: requested width was too large. Using largest allowed value instead."); if(maxTextureSize < w) w = maxTextureSize; if(maxRenderBufferSize < w) w = maxRenderBufferSize; } if( maxTextureSize < h || maxRenderBufferSize < h){ ofLog(OF_LOG_WARNING, "ofxFBOTexture: requested height was too large. Using largest allowed value instead."); if(maxTextureSize < h) h = maxTextureSize; if(maxRenderBufferSize < h) h = maxRenderBufferSize; } /** validates arg3 for legacy function calling style i dont check for 1 because 1 is a valid internal color format so we're not sure if the person is passing a boolean or a color format so we can't accuse them of doing the legacy boolean thing. Even if that stops the FBO, the other color format error will help them out. */ if(internalGlDataType==0){ ofLog(OF_LOG_WARNING, "ofxFBOTexture::allocate( _ , _ , HERE , _ ) " "The calling statement passed a boolean value like an older version of FBO object. " "This argument has changed to be a color format " "like GL_RGB, GL_RGBA, GL_RGBA16F_ARB, and GL_RGBA32F_ARB. " "Defaulting to GL_RGBA."); internalGlDataType = GL_RGBA; } // attempt to free the previous bound texture, if we can: clean(); texData.width = w; texData.height = h; this->numSamples = numSamples; /* *GLEE_ARB_texture_rectangle thows errors in the latest from github (post 0062?) so i commented this out */ //#ifndef TARGET_OPENGLES // if (GLEE_ARB_texture_rectangle){ // texData.tex_w = w; // texData.tex_h = h; // texData.textureTarget = GL_TEXTURE_RECTANGLE_ARB; // } else //#endif // { texData.tex_w = ofNextPow2(w); texData.tex_h = ofNextPow2(h); // } //#ifndef TARGET_OPENGLES // if (GLEE_ARB_texture_rectangle){ // texData.tex_t = w; // texData.tex_u = h; // } else //#endif // { texData.tex_t = w/texData.tex_w; texData.tex_u = h/texData.tex_h; //} texData.width = w; texData.height = h; texData.bFlipTexture = true; texData.glTypeInternal = internalGlDataType; #ifndef TARGET_OPENGLES switch(texData.glTypeInternal) { case GL_RGBA32F_ARB: case GL_RGBA16F_ARB: texData.glType = GL_RGBA; texData.pixelType = GL_FLOAT; pixels = new float[w * h * 4]; break; default: texData.glType = texData.glTypeInternal; texData.pixelType = GL_UNSIGNED_BYTE; pixels = new float[w * h * 4]; break; } #else texData.glType = GL_RGBA; texData.pixelType = GL_UNSIGNED_BYTE; pixels = new unsigned char[w * h * 4]; #endif // create & setup texture glGenTextures(1, (GLuint *)&texData.textureID); // could be more then one, but for now, just one glBindTexture(texData.textureTarget, (GLuint)texData.textureID); glTexParameterf(texData.textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(texData.textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameterf(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(texData.textureTarget, 0, texData.glTypeInternal, texData.tex_w, texData.tex_h, 0, texData.glType, texData.pixelType, 0); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); #ifndef TARGET_OPENGLES glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, (GLint *) &oldFramebuffer); if(numSamples ){ // MULTISAMPLE // //THEO Create the render buffer for depth glGenRenderbuffersEXT(1, &depthBuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, numSamples, GL_DEPTH_COMPONENT, texData.tex_w, texData.tex_h); //THEO multi sampled color buffer glGenRenderbuffersEXT(1, &colorBuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, colorBuffer); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, numSamples, texData.glTypeInternal, texData.tex_w, texData.tex_h); //THEO create fbo for multi sampled content and attach depth and color buffers to it glGenFramebuffersEXT(1, &mfbo); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mfbo); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, colorBuffer); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer); }else{ //THEO Create the render buffer for depth glGenRenderbuffersEXT(1, &depthBuffer); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, texData.tex_w, texData.tex_h); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer); } // create & setup FBO glGenFramebuffersEXT(1, &fbo); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // attach it to the FBO so we can render to it glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, texData.textureTarget, (GLuint)texData.textureID, 0); GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if(status != GL_FRAMEBUFFER_COMPLETE_EXT) { //validate arg3 after the fact because it's worth letting them try that format. if(internalGlDataType != GL_RGBA && internalGlDataType != GL_RGB && internalGlDataType != GL_RGBA16F_ARB && internalGlDataType != GL_RGBA32F_ARB){ ofLog(OF_LOG_ERROR, "ofxFBOTexture: Failed to initialize. " "I noticed that the calling statement did not passed an expected color format " "like GL_RGB, GL_RGBA, GL_RGBA16F_ARB, and GL_RGBA32F_ARB. You might try one of those. " "ofxFBOTexture::allocate( _ , _ , HERE , _ ) "); }else{ ofLog(OF_LOG_ERROR, "ofxFBOTexture: Failed to initialize."); } std::exit(1); } clear(0, 0, 0, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, oldFramebuffer); #else if(numSamples ){ ofLog(OF_LOG_WARNING, "Multi-sampling not supported on OpenGL ES"); }else{ } glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, (GLint *) &oldFramebuffer); // create & setup FBO glGenFramebuffersOES(1, &fbo); glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo); // attach it to the FBO so we can render to it glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, texData.textureTarget, (GLuint)texData.textureID, 0); glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFramebuffer); #endif texData.bAllocated = true; }