Проблема интерполяции билбордов OpenGL - PullRequest
1 голос
/ 04 апреля 2010

У меня есть квадрат рекламного щита с наложенной на него текстурой.

Это в основном некоторый текст с прозрачностью.

Рекламный щит плавает вперед и назад с точки зрения камеры.

Когда рекламный щит удаляется (и кажется меньше), появляется эффект мерцания по краям текста, где на фактической текстуре есть граница обводки.

Я думаю, это потому, что необходима интерполяция, поскольку изображение, которое обычно имеет ширину 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

Ответы [ 2 ]

1 голос
/ 12 мая 2010

Mipmapping контролируется отношением текселей к пикселям для отрисовываемых фрагментов (надеюсь, моя терминология там верна). Насколько большой вы рисуете на экране?

Если вы нарисуете его (скажем) 128x128, вы получите mipmap уровня 2, отсюда и размытие.

Текстуры должны создаваться в том размере, в котором они будут отображаться на экране или как можно ближе к нему, вместо того, чтобы создавать слишком много пикселей и позволять графическому процессору выбирать неподходящий уровень mipmap ...

1 голос
/ 09 мая 2010

Если бы вы использовали glu, я бы посоветовал вам попробовать использовать gluBuild2DMipmaps для создания mipmaps и посмотреть, как это делают другие.

Чтобы избежать использования функций glu, я иногда смотрю на реализацию Mesa OpenGL, чтобы получить некоторые идеи (обычно я стараюсь хранить много кода в своем собственном проекте ... и делюсь большим количеством его между OpenGL, D3D и другими платформ). Вы можете попытаться найти источник реализации Mesa (MesaLib) gluBuild2DMipmaps, чтобы увидеть, как вы можете получить подобный эффект. Он появляется в mipmap.c MesaLib, и вы, вероятно, в конечном итоге перейдете к реализации bitmapBuild2DMipmaps.

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

...