Рисование только части текстуры OpenGL ES iPhone - PullRequest
1 голос
/ 11 июня 2010

.. Продолжение моего предыдущего вопроса

У меня есть 320 * 480 кадровый буфер RGB565, который я хочу нарисовать, используя OpenGL ES 1.0 на 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];
}

Если я получу исходную текстуру в 512 * 512, то результат будет обрезан неправильно, но в остальном выглядит нормально.Однако при использовании требуемого размера вывода 320 * 480 все искажается и портится.

Я почти уверен, что именно так я копирую буфер кадров в новый буфер 512 * 512.Я пробовал эту процедуру

int8_t lBuf[512][512][2];
const char * frameDataP = frameData;
for (int ii = 0; ii < 480; ++ii) {
    memcpy(lBuf[ii], frameDataP, 320);
    frameDataP += 320;
}

Что лучше, но ширина кажется растянутой, а высота испорчена.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 11 июня 2010

Вы рисуете этот фон в портретном или ландшафтном режиме?Параметрами glDrawTexiOES являются (x, y, z, width, height), и, поскольку каждая другая часть вашего кода, по-видимому, ссылается на эти числа как 320x480, что может способствовать проблеме «неправильно обрезано» - попробуйте переключить 320 и 480 впрямоугольник обрезки и ширина / высота в вызове glDrawTex.(Возможно, я частично виноват в том, что не разместил параметры в последнем потоке. Извините!)

Вам придется использовать эту вторую процедуру копирования FB.Причина, по которой команда memcpy не работает, заключается в том, что она захватывает буфер 320x480x2 (307200 байт) и выгружает его в буфер 512x512x2 (524288 байт) в виде одного непрерывного блока - она ​​не будет знать достаточно для копирования 320 байт, добавьте 192 блока «мертвого пространства» и возобновите.

0 голосов
/ 11 июня 2010

Похоже, что выделенный буфер недостаточно велик. Если у вас есть 8 бит (1 байт) для каждого компонента цвета, вы выделяете один байт слишком мало. Это может объяснить, почему изображение отображается правильно только для части изображения. Я бы подумал следующие строки:

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

необходимо изменить на:

 //Create enough storage for a 512x512 power of 2 texture
 int8_t lBuf[3*512*512];
 memcpy (lBuf, frameBuf, 320*480*3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...