Я пытаюсь сохранить изображение 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, то возникает перекос.