views:

235

answers:

2

..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.

A: 

It looks like the buffer allocated isn't large enough. If you have 8 bits (1 byte) per color component, you are allocating one byte too few. This could explain why the image shows correct for only a part of the image. I would think the following lines:

 //Create enough storage for a 512x512 power of 2 texture
 int8_t lBuf[2*512*512];
 memcpy (lBuf, frameBuf, 320*480*2);

would need to be changed to:

 //Create enough storage for a 512x512 power of 2 texture
 int8_t lBuf[3*512*512];
 memcpy (lBuf, frameBuf, 320*480*3);
zooropa
@zooropa: Ben's loading it as RGB565 (16bpp) - two bytes per pixel is correct.
Chris Peredun
+1  A: 

Are you drawing this background in portrait or landscape mode? The glDrawTexiOES parameters are (x, y, z, width, height) and since every other part of your code seems to reference those numbers as 320x480 that might be contributing to the "cropped incorrectly" problem - try switching the 320 and 480 in the cropping rectangle and the width/height in the glDrawTex call. (Might be partially my fault here for not posting the parameters in the last thread. Sorry!)

You'll have to use that second FB copy routine though. The reason the memcpy command won't work is because it will grab the 320x480x2 buffer (307200 bytes) and dump it into a 512x512x2 buffer (524288 bytes) as a single contiguous block - it won't know enough to copy 320 bytes, add 192 blocks of "dead space", and resume.

Chris Peredun