void onDisplay() { glClear(GL_COLOR_BUFFER_BIT); drawTexQuad(g_commTex, -1, -1, 1, 1); { if (++g_curMaskAlpha >= 256) { g_curMaskAlpha = 0; if (++g_curMaskTex >= MASK_TEX_CNT) { g_curMaskTex = 0; } } glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, g_curMaskAlpha / 255.0f); glEnable(GL_BLEND); glBlendFunc(GL_DST_COLOR, GL_ZERO); drawTexQuad(g_maskTexs[g_curMaskTex], -1, -1, 1, 1); glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); } detectGLError(); glutSwapBuffers(); }
bool ColorBuffer::post() { s_gl.glBindTexture(GL_TEXTURE_2D, m_tex); s_gl.glEnable(GL_TEXTURE_2D); s_gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); drawTexQuad(); return true; }
void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect, const video::SColor* const colors, bool useAlphaChannelOfTexture) { if (!irr_driver->isGLSL()) { irr_driver->getVideoDriver()->draw2DImage(texture, destRect, sourceRect, clipRect, colors, useAlphaChannelOfTexture); return; } float width, height, center_pos_x, center_pos_y, tex_width, tex_height, tex_center_pos_x, tex_center_pos_y; getSize(texture->getOriginalSize().Width, texture->getOriginalSize().Height, texture->isRenderTarget(), destRect, sourceRect, width, height, center_pos_x, center_pos_y, tex_width, tex_height, tex_center_pos_x, tex_center_pos_y); if (useAlphaChannelOfTexture) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (clipRect) { if (!clipRect->isValid()) return; glEnable(GL_SCISSOR_TEST); const core::dimension2d<u32>& renderTargetSize = irr_driver->getVideoDriver()->getCurrentRenderTargetSize(); glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y, clipRect->getWidth(), clipRect->getHeight()); } if (colors) drawTexColoredQuad(texture, colors, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); else drawTexQuad(static_cast<const irr::video::COpenGLTexture*>(texture)->getOpenGLTextureName(), width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); if (clipRect) glDisable(GL_SCISSOR_TEST); glUseProgram(0); glGetError(); }
bool ColorBuffer::blitFromPbuffer(EGLSurface p_pbufSurface) { FrameBuffer *fb = FrameBuffer::getFB(); if (!fb->bind_locked()) return false; // // bind FBO object which has this colorbuffer as render target // if (!bind_fbo()) { fb->unbind_locked(); return false; } // // bind the pbuffer to a temporary texture object // GLuint tempTex; s_gl.glGenTextures(1, &tempTex); s_gl.glBindTexture(GL_TEXTURE_2D, tempTex); if (!s_egl.eglBindTexImage(fb->getDisplay(), p_pbufSurface, EGL_BACK_BUFFER)) { printf("eglBindTexImage failed 0x%x\n", s_egl.eglGetError()); s_gl.glDeleteTextures(1, &tempTex); fb->unbind_locked(); return false; } s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); s_gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); s_gl.glEnable(GL_TEXTURE_2D); drawTexQuad(); // // unbind FBO, release the pbuffer and delete the temp texture object // s_gl.glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); s_egl.eglReleaseTexImage(fb->getDisplay(), p_pbufSurface, EGL_BACK_BUFFER); s_gl.glDeleteTextures(1, &tempTex); fb->unbind_locked(); return true; }
// ---------------------------------------------------------------------------- void draw2DImage(const video::ITexture* texture, const core::rect<float>& destRect, const core::rect<s32>& sourceRect, const core::rect<s32>* clip_rect, const video::SColor* const colors, bool use_alpha_channel_of_texture, bool draw_translucently) { if (!CVS->isGLSL()) { core::rect<irr::s32> dest_rect (irr::s32(destRect.UpperLeftCorner.X), irr::s32(destRect.UpperLeftCorner.Y), irr::s32(destRect.LowerRightCorner.X), irr::s32(destRect.LowerRightCorner.Y)); irr_driver->getVideoDriver()->draw2DImage(texture, dest_rect, sourceRect, clip_rect, colors, use_alpha_channel_of_texture); return; } float width, height, center_pos_x, center_pos_y, tex_width, tex_height; float tex_center_pos_x, tex_center_pos_y; getSize(texture->getSize().Width, texture->getSize().Height, texture->isRenderTarget(), destRect, sourceRect, width, height, center_pos_x, center_pos_y, tex_width, tex_height, tex_center_pos_x, tex_center_pos_y); if (draw_translucently) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); } else if (use_alpha_channel_of_texture) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (clip_rect) { if (!clip_rect->isValid()) return; glEnable(GL_SCISSOR_TEST); const core::dimension2d<u32>& render_target_size = irr_driver->getActualScreenSize(); glScissor(clip_rect->UpperLeftCorner.X, render_target_size.Height - clip_rect->LowerRightCorner.Y, clip_rect->getWidth(), clip_rect->getHeight()); } if (colors) { drawTexColoredQuad(texture, colors, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); } else { drawTexQuad(texture->getOpenGLTextureName(), width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); } if (clip_rect) glDisable(GL_SCISSOR_TEST); glUseProgram(0); glGetError(); } // draw2DImage
void draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect, const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect, const video::SColor* const colors, bool useAlphaChannelOfTexture) { if (!irr_driver->isGLSL()) { irr_driver->getVideoDriver()->draw2DImage(texture, destRect, sourceRect, clipRect, colors, useAlphaChannelOfTexture); return; } core::dimension2d<u32> frame_size = irr_driver->getVideoDriver()->getCurrentRenderTargetSize(); const int screen_w = frame_size.Width; const int screen_h = frame_size.Height; float center_pos_x = destRect.UpperLeftCorner.X + destRect.LowerRightCorner.X; center_pos_x /= screen_w; center_pos_x -= 1.; float center_pos_y = destRect.UpperLeftCorner.Y + destRect.LowerRightCorner.Y; center_pos_y /= screen_h; center_pos_y = 1. - center_pos_y; float width = destRect.LowerRightCorner.X - destRect.UpperLeftCorner.X; width /= screen_w; float height = destRect.LowerRightCorner.Y - destRect.UpperLeftCorner.Y; height /= screen_h; const core::dimension2d<u32>& ss = texture->getOriginalSize(); float tex_center_pos_x = sourceRect.UpperLeftCorner.X + sourceRect.LowerRightCorner.X; tex_center_pos_x /= ss.Width * 2.; //tex_center_pos_x -= 1.; float tex_center_pos_y = sourceRect.UpperLeftCorner.Y + sourceRect.LowerRightCorner.Y; tex_center_pos_y /= ss.Height * 2.; //tex_center_pos_y -= 1.; float tex_width = sourceRect.LowerRightCorner.X - sourceRect.UpperLeftCorner.X; tex_width /= ss.Width * 2.; float tex_height = sourceRect.LowerRightCorner.Y - sourceRect.UpperLeftCorner.Y; tex_height /= ss.Height * 2.; if (texture->isRenderTarget()) { tex_height = - tex_height; } const f32 invW = 1.f / static_cast<f32>(ss.Width); const f32 invH = 1.f / static_cast<f32>(ss.Height); const core::rect<f32> tcoords( sourceRect.UpperLeftCorner.X * invW, sourceRect.UpperLeftCorner.Y * invH, sourceRect.LowerRightCorner.X * invW, sourceRect.LowerRightCorner.Y *invH); if (useAlphaChannelOfTexture) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glDisable(GL_BLEND); } if (colors) drawTexColoredQuad(texture, colors, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); else drawTexQuad(texture, width, height, center_pos_x, center_pos_y, tex_center_pos_x, tex_center_pos_y, tex_width, tex_height); glUseProgram(0); }
bool ColorBuffer::blitFromCurrentReadBuffer() { RenderThreadInfo *tInfo = getRenderThreadInfo(); if (!tInfo->currContext.Ptr()) { // no Current context return false; } // // Create a temporary texture inside the current context // from the blit_texture EGLImage and copy the pixels // from the current read buffer to that texture // GLuint tmpTex; GLint currTexBind; if (tInfo->currContext->isGL2()) { s_gl2.glGetIntegerv(GL_TEXTURE_BINDING_2D, &currTexBind); s_gl2.glGenTextures(1,&tmpTex); s_gl2.glBindTexture(GL_TEXTURE_2D, tmpTex); s_gl2.glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_blitEGLImage); s_gl2.glCopyTexImage2D(GL_TEXTURE_2D, 0, m_internalFormat, 0, 0, m_width, m_height, 0); } else { s_gl.glGetIntegerv(GL_TEXTURE_BINDING_2D, &currTexBind); s_gl.glGenTextures(1,&tmpTex); s_gl.glBindTexture(GL_TEXTURE_2D, tmpTex); s_gl.glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_blitEGLImage); s_gl.glCopyTexImage2D(GL_TEXTURE_2D, 0, m_internalFormat, 0, 0, m_width, m_height, 0); } // // Now bind the frame buffer context and blit from // m_blitTex into m_tex // FrameBuffer *fb = FrameBuffer::getFB(); if (fb->bind_locked()) { // // bind FBO object which has this colorbuffer as render target // if (bind_fbo()) { // // save current viewport and match it to the current // colorbuffer size // GLint vport[4]; s_gl.glGetIntegerv(GL_VIEWPORT, vport); s_gl.glViewport(0, 0, m_width, m_height); // render m_blitTex s_gl.glBindTexture(GL_TEXTURE_2D, m_blitTex); s_gl.glEnable(GL_TEXTURE_2D); s_gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); drawTexQuad(); // this will render the texture flipped // unbind the fbo s_gl.glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); // restrore previous viewport s_gl.glViewport(vport[0], vport[1], vport[2], vport[3]); } // unbind from the FrameBuffer context fb->unbind_locked(); } // // delete the temporary texture and restore the texture binding // inside the current context // if (tInfo->currContext->isGL2()) { s_gl2.glDeleteTextures(1, &tmpTex); s_gl2.glBindTexture(GL_TEXTURE_2D, currTexBind); } else { s_gl.glDeleteTextures(1, &tmpTex); s_gl.glBindTexture(GL_TEXTURE_2D, currTexBind); } return true; }