Drawing only part of a
        Posted  
        
            by Ben Reeves
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Ben Reeves
        
        
        
        Published on 2010-06-11T12:47:26Z
        Indexed on 
            2010/06/11
            12:53 UTC
        
        
        Read the original article
        Hit count: 372
        
..Continued on from my previous question
I have a 320*480 RGB565 framebuffer which I wish to draw using OpenGL ES 1.0 on the iPhone.
- (void)setupView
{   
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, (int[4]){0, 0, 480, 320});
    glEnable(GL_TEXTURE_2D);
}
// Updates the OpenGL view when the timer fires
- (void)drawView
{
  // Make sure that you are drawing to the current context 
  [EAGLContext setCurrentContext:context];
  //Get the 320*480 buffer
  const int8_t * frameBuf = [source getNextBuffer];
  //Create enough storage for a 512x512 power of 2 texture
  int8_t lBuf[2*512*512];
  memcpy (lBuf, frameBuf, 320*480*2);
  //Upload the texture
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, lBuf);
  //Draw it
  glDrawTexiOES(0, 0, 1, 480, 320);
  [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
If I produce the original texture in 512*512 the output is cropped incorrectly but other than that looks fine. However using the require output size of 320*480 everything is distorted and messed up.
I'm pretty sure it's the way I'm copying the framebuffer into the new 512*512 buffer. I have tried this routine
int8_t lBuf[512][512][2];
const char * frameDataP = frameData;
for (int ii = 0; ii < 480; ++ii) {
    memcpy(lBuf[ii], frameDataP, 320);
    frameDataP += 320;
}
Which is better, but the width appears to be stretched and the height is messed up.
Any help appreciated.
© Stack Overflow or respective owner