⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dwtobj.cpp

📁 This code demonstrate Fast Wavelet Transform. Executable and can be run on Visual C++ platform
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  {
    cgGLLoadProgram(m_fillProg);
    m_fill_Tex_Param = cgGetNamedParameter(m_fillProg, "texture");
    assert(m_fill_Tex_Param != NULL);

  }


  //*******************************************************
  //****            forward dwt programs               ****
  //*******************************************************
  if (mode == forward || mode == both)
  {
    // Horizontal 1D forward DWT 
    m_dwtrowProg = cgCreateProgram(cgContext,
                                   CG_SOURCE,
                                   dwtsource, m_fpProfile, NULL, NULL);
    if (m_dwtrowProg != NULL)
    {
      cgGLLoadProgram(m_dwtrowProg);
      m_dwtrow_imageTex_Param  = cgGetNamedParameter(m_dwtrowProg, "dwt");
      assert(m_dwtrow_imageTex_Param != NULL);
      m_dwtrow_filterTex_Param = cgGetNamedParameter(m_dwtrowProg, "filter");
      assert(m_dwtrow_filterTex_Param != NULL);
      m_dwtrow_lookup_Param    = cgGetNamedParameter(m_dwtrowProg, "lut");
      assert(m_dwtrow_lookup_Param != NULL);
      m_dwtrow_level_Param     = cgGetNamedParameter(m_dwtrowProg, "level");
      assert(m_dwtrow_level_Param != NULL);

    }

    // Vertical 1D forward DWT 
    m_dwtcolProg = cgCreateProgram(cgContext,
                                   CG_SOURCE,
                                   dwtcolsource,
                                   m_fpProfile, NULL, NULL);
    if (m_dwtcolProg != NULL)
    {
      cgGLLoadProgram(m_dwtcolProg);
      m_dwtcol_imageTex_Param  = cgGetNamedParameter(m_dwtcolProg, "dwt");
      assert(m_dwtcol_imageTex_Param != NULL);
      m_dwtcol_filterTex_Param = cgGetNamedParameter(m_dwtcolProg, "filter");
      assert(m_dwtcol_filterTex_Param != NULL);
      m_dwtcol_lookup_Param    = cgGetNamedParameter(m_dwtcolProg, "lut");
      assert(m_dwtcol_lookup_Param != NULL);
      m_dwtcol_level_Param     = cgGetNamedParameter(m_dwtcolProg, "level");
      assert(m_dwtcol_level_Param != NULL);
    }
  }



  //*******************************************************
  //****            inverse dwt programs                ***
  //*******************************************************
  if (mode == inverse || mode == both)
  {

    // Horizontal 1D inverse DWT
    m_invdwtrowProg = cgCreateProgram(cgContext,
                                      CG_SOURCE,
                                      invdwtsource,
                                      m_fpProfile, NULL, NULL);
    if (m_invdwtrowProg != NULL)
    {
      cgGLLoadProgram(m_invdwtrowProg);
      m_invdwtrow_imageTex_Param  = cgGetNamedParameter(m_invdwtrowProg, "dwt");
      assert(m_invdwtrow_imageTex_Param != NULL);
      m_invdwtrow_filterTex_Param = cgGetNamedParameter(m_invdwtrowProg, "filter");
      assert(m_invdwtrow_filterTex_Param != NULL);
      m_invdwtrow_lookup_Param    = cgGetNamedParameter(m_invdwtrowProg, "lut");
      assert(m_invdwtrow_lookup_Param != NULL);
      m_invdwtrow_level_Param     = cgGetNamedParameter(m_invdwtrowProg, "level");
      assert(m_invdwtrow_level_Param != NULL);
    }


    // Vertical 1D inverse DWT
    m_invdwtcolProg = cgCreateProgram(cgContext,
                                      CG_SOURCE,
                                      invdwtcolsource,                                      
                                      m_fpProfile, NULL, NULL);
    if (m_invdwtcolProg != NULL)
    {
      cgGLLoadProgram(m_invdwtcolProg);
      m_invdwtcol_imageTex_Param  = cgGetNamedParameter(m_invdwtcolProg, "dwt");
      assert(m_invdwtcol_imageTex_Param != NULL);
      m_invdwtcol_filterTex_Param = cgGetNamedParameter(m_invdwtcolProg, "filter");
      assert(m_invdwtcol_filterTex_Param != NULL);
      m_invdwtcol_lookup_Param    = cgGetNamedParameter(m_invdwtcolProg, "lut");
      assert(m_invdwtcol_lookup_Param != NULL);
      m_invdwtcol_level_Param     = cgGetNamedParameter(m_invdwtcolProg, "level");
      assert(m_invdwtcol_level_Param != NULL);
      m_invdwtcol_texwidth_Param  = cgGetNamedParameter(m_invdwtcolProg, "texwidth");
      assert(m_invdwtcol_texwidth_Param != NULL);
      m_invdwtcol_texheight_Param = cgGetNamedParameter(m_invdwtcolProg, "texheight");
      assert(m_invdwtcol_texheight_Param != NULL);
    }
  }

  return true;
}




//------------------------------------------------------------------------------
// Function         : CDwtObj::get_buffer
// Description      : retrieve the transformed buffer
//------------------------------------------------------------------------------
// [in,out] myfloatbuffer-- pointer to USER ALLOCATED buffer for storing the result
//
void CDwtObj::getbuffer(float *myfloatbuffer)
{
  if ( m_busefbo )
  {
    //select the last operated colorbuffer and readback the pixel values       
    if(m_iReadBuffer == 0) 
      glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); 
    else 
      glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);    
    glReadPixels(0, 0, m_imageWidth, m_imageHeight, GL_RGB, GL_FLOAT, myfloatbuffer);
    // Disable the FBO
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  }
  else  
  {
    //select the last operated buffer and readback the pixel values         
    m_rt[1 - m_iReadBuffer]->BeginCapture();
    glReadPixels(0, 0, m_imageWidth, m_imageHeight, GL_RGB, GL_FLOAT, myfloatbuffer);
    PrintGLerror("readbuffer");
    m_rt[1 - m_iReadBuffer]->EndCapture();
  }
}




//------------------------------------------------------------------------------
// Function         : CDwtObj::createFilterTex
// Description      : create the high/low pass filter texture
//------------------------------------------------------------------------------
// [in] mode--dwt mode ( forward, backward ,both)
//
bool CDwtObj::createFilterTex(dwtmode mode)
{

  DELTEXTURES(1, &m_decomFilterTexID);
  DELTEXTURES(1, &m_reconFilterTexID);
  glGenTextures(1, &m_decomFilterTexID);
  glGenTextures(1, &m_reconFilterTexID);

  // create the filter textures
  if (mode == forward || mode == both)
  {
    glBindTexture(GL_TEXTURE_RECTANGLE_NV, m_decomFilterTexID);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, 18, 1, 0, GL_RED, GL_FLOAT, decomp_filter);
  }

  if (mode == inverse || mode == both)
  {
    glBindTexture(GL_TEXTURE_RECTANGLE_NV, m_reconFilterTexID);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_R32_NV, 18, 1, 0, GL_RED, GL_FLOAT, recon_filter);
  }

  return true;
}


//------------------------------------------------------------------------------
// Function         : CDwtObj::forward_dwt
// Description      : do forward dwt
//------------------------------------------------------------------------------
// [in] level-- level 0 for whole image, level 1 for upper left 1/4 image, and so on
// [in] startx, endx, starty, endy -- the indices of x and y direction
//
// Modification history
//
// 15 March 2006 (by Liang Wan)
// -- Use Framebuffer objects in place of pbuffer
// 
#define RASTER_QUAD    { glBegin(GL_QUADS);                                        \
                           glTexCoord2f(             0.0f,               0.0f);    \
                           glVertex2f  (             0.0f,               0.0f);    \
                           glTexCoord2f((float) quadWidth,               0.0f);    \
                           glVertex2f  ((float) quadWidth,               0.0f);    \
                           glTexCoord2f((float) quadWidth, (float) quadHeight);    \
                           glVertex2f  ((float) quadWidth, (float) quadHeight);    \
                           glTexCoord2f(0.0f,              (float) quadHeight);    \
                           glVertex2f  (0.0f,              (float) quadHeight);    \
                         glEnd(); }

bool CDwtObj::forwarddwt(int level, int startx, int starty, int endx, int endy)
{

  int quadWidth, quadHeight, tmp;

  calLength(startx, endx, level, &quadWidth, &tmp);
  calLength(starty, endy, level, &quadHeight, &tmp);

  // Vertical Decomposition

  if (quadHeight > 1)
  {
    if ( m_busefbo ) 
    {
      if ( m_iReadBuffer == 0 ) 
        glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
      else 
        glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);      
    } 
    else 
      m_rt[m_iReadBuffer]->BeginCapture();
    

    cgGLBindProgram   (m_dwtcolProg);
    cgGLEnableProfile(m_fpProfile);
    cgGLSetParameter1f(m_dwtcol_level_Param, level);
    if ( m_busefbo ) 
      cgGLSetTextureParameter    (m_dwtcol_imageTex_Param,  m_fbort[1-m_iReadBuffer]);
    else 
      cgGLSetTextureParameter    (m_dwtcol_imageTex_Param,  m_rt[1 - m_iReadBuffer]->GetTextureID());
    
    cgGLEnableTextureParameter (m_dwtcol_imageTex_Param);
    cgGLSetTextureParameter    (m_dwtcol_filterTex_Param, m_decomFilterTexID);
    cgGLEnableTextureParameter (m_dwtcol_filterTex_Param);
    cgGLSetTextureParameter    (m_dwtcol_lookup_Param,    m_colLookupTexID);
    cgGLEnableTextureParameter (m_dwtcol_lookup_Param);

    // Draw the quad or actually perform vertical decomposition
    RASTER_QUAD;

    cgGLDisableTextureParameter(m_dwtcol_imageTex_Param);
    cgGLDisableTextureParameter(m_dwtcol_filterTex_Param);
    cgGLDisableTextureParameter(m_dwtcol_lookup_Param);
    cgGLDisableProfile(m_fpProfile);

    if ( !m_busefbo ) 
      m_rt[m_iReadBuffer]->EndCapture();
    
    m_iReadBuffer = (m_iReadBuffer + 1) % 2;
  }
  else   // pass through if not enough length
  {
    if ( m_busefbo ) 
    {
      if ( m_iReadBuffer == 0 ) 
        glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
      else 
        glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
    } 
    else 
      m_rt[m_iReadBuffer]->BeginCapture();

    cgGLBindProgram(m_fillProg);
    cgGLEnableProfile(m_fpProfile);
    if ( m_busefbo ) 
      cgGLSetTextureParameter   (m_fill_Tex_Param, m_fbort[1 - m_iReadBuffer]);
    else 
      cgGLSetTextureParameter   (m_fill_Tex_Param, m_rt[1 - m_iReadBuffer]->GetTextureID());    
    cgGLEnableTextureParameter(m_fill_Tex_Param);

    RASTER_QUAD;

    cgGLDisableTextureParameter(m_fill_Tex_Param);
    cgGLDisableProfile(m_fpProfile);

    if ( !m_busefbo ) 
      m_rt[m_iReadBuffer]->EndCapture();
    
    m_iReadBuffer = (m_iReadBuffer + 1) % 2;
  }



  // Horizontal  Decomposition
  if (quadWidth > 1)
  {
    if ( m_busefbo ) 
    {
      if ( m_iReadBuffer == 0 ) 
        glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
      else 
        glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);      
    }
    else 
      m_rt[m_iReadBuffer]->BeginCapture();
    
    cgGLBindProgram   (m_dwtrowProg);
    cgGLEnableProfile(m_fpProfile);
    cgGLSetParameter1f(m_dwtrow_level_Param, (float) level);
    if ( m_busefbo ) 
      cgGLSetTextureParameter(m_dwtrow_imageTex_Param,  m_fbort[1-m_iReadBuffer]);
    else 
      cgGLSetTextureParameter(m_dwtrow_imageTex_Param,  m_rt[1 - m_iReadBuffer]->GetTextureID());    
    cgGLEnableTextureParameter(m_dwtrow_imageTex_Param);
    cgGLSetTextureParameter   (m_dwtrow_filterTex_Param, m_decomFilterTexID);
    cgGLEnableTextureParameter(m_dwtrow_filterTex_Param);
    cgGLSetTextureParameter   (m_dwtrow_lookup_Param,    m_rowLookupTexID);
    cgGLEnableTextureParameter(m_dwtrow_lookup_Param);

    RASTER_QUAD;

    cgGLDisableTextureParameter(m_dwtrow_imageTex_Param);
    cgGLDisableTextureParameter(m_dwtrow_filterTex_Param);
    cgGLDisableTextureParameter(m_dwtrow_lookup_Param);
    cgGLDisableProfile(m_fpProfile);
    if ( !m_busefbo ) 
      m_rt[m_iReadBuffer]->EndCapture();
    m_iReadBuffer = (m_iReadBuffer + 1) % 2;
  }
  else   // pass through if not enough length
  {
    if ( m_busefbo ) 
    {
      if ( m_iReadBuffer == 0 ) 
        glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
      else 
        glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);      
    } 
    else 
      m_rt[m_iReadBuffer]->BeginCapture();
    cgGLBindProgram  (m_fillProg);
    cgGLEnableProfile(m_fpProfile);
    if ( m_busefbo ) 
      cgGLSetTextureParameter   (m_fill_Tex_Param, m_fbort[1 - m_iReadBuffer]);
    else 
      cgGLSetTextureParameter   (m_fill_Tex_Param, m_rt[1 - m_iReadBuffer]->GetTextureID());    
    cgGLEnableTextureParameter(m_fill_Tex_Param);

    RASTER_QUAD;

    cgGLDisableTextureParameter(m_fill_Tex_Param);
    cgGLDisableProfile(m_fpProfile);
    if ( !m_busefbo ) 
      m_rt[m_iReadBuffer]->EndCapture();
    m_iReadBuffer = (m_iReadBuffer + 1) % 2;
  }

  return true;
}





//------------------------------------------------------------------------------
// Function         : CDwtObj::OneTimeDWT2
// Description      : one-stop solution for dwt,  
//------------------------------------------------------------------------------
// [in] mode    -- boundary extension mode (symper, per)
// [in] imagewidth,  imageheight  -- image dimension
// [in out]  imagebuffer        --  pointer for input buffer, when returned it holds the output
// [in]  beg_level, end_level -- begin level and end level for dwt
// [in]  isforward      -- ture for forward transform , false for inverse
// [in]  initGL -- initialize opengl? ( in opengl app, usually false)
// [in] initGLEW -- initialize glew, the extension libary
// [in] startx, endx, starty, endy -- the indices of x and y direction
//
bool CDwtObj::dwtallinone(extmode mode, int imagewidth, int imageheight, float *imagebuffer, int beg_level, int end_level,
                          bool isforward, bool initGL, bool initGLEW, int startx, int starty, int endx, int endy)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -