У меня есть квадрат рекламного щита с наложенной на него текстурой.
Это в основном некоторый текст с прозрачностью.
Рекламный щит плавает вперед и назад с точки зрения камеры.
Когда рекламный щит удаляется (и кажется меньше), появляется эффект мерцания
по краям текста, где на фактической текстуре есть граница обводки.
Я думаю, это потому, что необходима интерполяция, поскольку изображение, которое обычно имеет ширину X пикселей, теперь отображается как только% X, и некоторые пиксели необходимо объединить вместе. Я думаю, это делает ближайший сосед или что-то? Кто-нибудь может указать мне правильное направление для настроек opengl, чтобы контролировать это, я предполагаю, что есть какой-то способ предотвратить этот эффект, настроив метод обработки текстуры?
Я думаю, это как-то связано с:
GL_NEAREST_MIPMAP_NEAREST
но когда я пытаюсь установить его для фильтра MIN и включить mip mapping, моя текстура становится очень блочной и размытой ...
Я также пробовал:
GL_LINEAR_MIPMAP_LINEAR
, который, по-видимому, является трехлетней фильтрацией для фильтра MIN, но мое изображение очень размыто при отображении. (похоже, это текстура с очень низким разрешением) Есть идеи, что я делаю не так?
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // trilinear
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
Дополнительный код:
// Allocated memory needed for the bitmap context
spriteData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
// Uses the bitmap creation function provided by the Core Graphics framework.
spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width * 4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
// After you create the context, you can draw the sprite image to the context.
CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), spriteImage);
// You don't need the context at this point, so you need to release it to avoid memory leaks.
CGContextRelease(spriteContext);
// Use OpenGL ES to generate a name for the texture.
glGenTextures(1, &spriteTexture[textureCount-1]);
// Bind the texture name.
glBindTexture(GL_TEXTURE_2D, spriteTexture[textureCount-1]);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Specify a 2D texture image, providing the a pointer to the image data in memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
// Release the image data
free(spriteData);
Текстура 512 х 512.
Пример размытия при использовании фильтра MIN:
Размытый рекламный щит http://i43.tinypic.com/2h2qe6u.jpg
Когда просто используется GL_NEAREST для минимального фильтра, более острый, но неприятный билинейный и мерцание, как упомянуто выше, когда анимируется как сокращение:
GL_NEAREST http://i42.tinypic.com/28a5kdf.jpg