Проблема OpenGL Рисование текстуры большого изображения, вызывающее перекос - PullRequest
0 голосов
/ 07 апреля 2011

Я пытаюсь сохранить изображение 1365x768 на текстуре 2048x1024 в OpenGL ES, но полученное изображение после перерисовки выглядит искаженным.Если я запускаю то же изображение 1365x768 с помощью gluScaleImage () и помещаю его на текстуру 2048x1024, при рисовании оно выглядит хорошо, но этот вызов OpenGL медленный и снижает производительность.

Я делаю это на устройстве Android (MotorolaMilestone), который имеет 256 МБ памяти.Не уверен, что память является фактором, хотя, поскольку он работает нормально при масштабировании с использованием gluScaleImage () (это просто медленнее.)

Отображение текстур меньшего размера (например, 854x480 на 1024x512) работает нормально.Кто-нибудь знает, почему это и предложения о том, что я могу с этим поделать?

Обновление

Некоторые фрагменты кода, помогающие понять контекст ...

// uiImage is loaded. The texture dimensions are determined from upsizing the image
// dimensions to a power of two size:
// uiImage->_width = 1365
// uiImage->_height = 768
// width = 2048
// height = 1024

// Once the image is loaded:
// INT retval = gluScaleImage(GL_RGBA, uiImage->_width, uiImage->_height, GL_UNSIGNED_BYTE, uiImage->_texels, width, height, GL_UNSIGNED_BYTE, data);
copyImage(GL_RGBA, uiImage->_width, uiImage->_height, GL_UNSIGNED_BYTE, uiImage->_texels, width, height, GL_UNSIGNED_BYTE, data);

if (pixelFormat == RGB565 || pixelFormat == RGBA4444) 
{
    unsigned char* tempData = NULL;
    unsigned int* inPixel32;
    unsigned short* outPixel16;
    tempData = new unsigned char[height*width*2];
    inPixel32 = (unsigned int*)data;
    outPixel16 = (unsigned short*)tempData;

    if(pixelFormat == RGB565)
    {
        // "RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" --> "RRRRRGGGGGGBBBBB"
        for(unsigned int i = 0; i < numTexels; ++i, ++inPixel32)
        {
            *outPixel16++ = ((((*inPixel32 >> 0) & 0xFF) >> 3) << 11) | 
                            ((((*inPixel32 >> 8) & 0xFF) >> 2) << 5) | 
                            ((((*inPixel32 >> 16) & 0xFF) >> 3) << 0);
        }
    }

    if(tempData != NULL)
    {
        delete [] data;
        data = tempData;
    }
}
// [snip..]

// Copy function (mostly)
static void copyImage(GLint widthin, GLint heightin, const unsigned int* datain, GLint widthout, GLint heightout, unsigned int* dataout)
{
    unsigned int* p1 = const_cast<unsigned int*>(datain);
    unsigned int* p2 = dataout;
    int nui = widthin * sizeof(unsigned int);
    for(int i = 0; i < heightin; i++)
    {
        memcpy(p2, p1, nui);
        p1 += widthin;
        p2 += widthout;
    }
}

В коде рендеринга, не меняя мои координаты текстуры, я должен видеть правильное изображение при использовании gluScaleImage () и меньшее изображение (которое требует более поздних поправочных коэффициентов) для кода copyImage ().Это то, что происходит, когда изображение маленькое (например, 854x480 отлично работает с copyImage ()), но когда я использую изображение 1365x768, то возникает перекос.

1 Ответ

0 голосов
/ 08 апреля 2011

Наконец-то решили проблему.Первое, что нужно знать, это то, какой максимальный размер текстуры разрешен для устройства:

GLint texSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);

Когда я запускал это, максимальный размер текстуры для Motorola Milestone составлял 2048x2048, что было хорошо в моем случае.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...