Непонятная проблема, связанная с MIP-картой при использовании SOIL - OpenGL - PullRequest
3 голосов
/ 31 января 2012

Я использую SOIL для генерации текстур OpenGL.Все хорошо, за исключением отдаленных артефактов, вызванных созданием MIP-карт в SOIL.Когда я не использую флаг:

SOIL_FLAG_MIPMAPS

Это не артефакт, НО он выглядит плохо.Кто-нибудь видел такие артефакты?Над водой есть бордовый цвет, а над песком это выглядит как светло-зеленое / синее искажение.

Вот как это выглядит:

enter image description here

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

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

Чтобы убедиться, что это причина, прочитайте данные обратно с уровней mip загруженной вами текстуры. Используя glReadPixels или что-то еще. Если последние уровни MIP содержат мусор - это вина вашей процедуры загрузки текстуры. Вы также можете использовать фильтр GL_LINEAR_MIPMAP_NEAREST и посмотреть, есть ли определенный уровень мипа с фиолетовыми пикселями.

Чтобы обойти проблему, сгенерируйте изображение для первого уровня и используйте glGenerateMipmaps (OpenGL 3+), glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); (OpenGL 2+ или OpenGL 1.4+ - я забыл, в какой версии оно было добавлено. Устаревшее в OpenGL 3 +) или gluBuild2DMipMap (древние версии OpenGL).

Или вы можете сами рассчитать мипмапы. Бокс-фильтр не сложно реализовать. Гауссов тоже не сложно.

Если вы генерируете текстуры, используя формулу (поскольку вы сказали «сгенерировать»), другой возможный сценарий заключается в том, что формула вызывает ошибку вычисления на последнем уровне mip, что приводит к появлению мусорных цветов.

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

0 голосов
/ 01 февраля 2012

Анизотропная фильтрация может помочь:

// right after you set your GL_TEXTURE_MIN/MAG_FILTER
if( glewIsSupported("GL_EXT_texture_filter_anisotropic") )
{
    GLfloat max;
    glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max);
}

Альтернативно, какая-то ошибка загрузки / координаты текстуры, хотя недостаточно информации, чтобы быть уверенной (т. Е. Полная минимальная программа, котораядемонстрирует проблему).

...