Я использую текстуры в OpenGL (в FLTK с C ++) и использую MIPMAP. Я делаю мультиплатформенный проект (текущее кодирование в Mac), но я не хочу использовать расширения в Windows, поэтому я не использую glGenerateMipmap и поэтому решил сделать их вручную. Я делаю это в этом примере для «пола» и «потолка». Я использую следующий код для загрузки данных из версий изображений с различным разрешением
glGenTextures(1, &ceiling_texture);
glBindTexture(GL_TEXTURE_2D, ceiling_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 8);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ceiling_width0, ceiling_height0, 0, GL_RGB, GL_FLOAT, ceiling_pixels0);
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, ceiling_width1, ceiling_height1, 0, GL_RGB, GL_FLOAT, ceiling_pixels1);
glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, ceiling_width2, ceiling_height2, 0, GL_RGB, GL_FLOAT, ceiling_pixels2);
glTexImage2D(GL_TEXTURE_2D, 3, GL_RGB, ceiling_width3, ceiling_height3, 0, GL_RGB, GL_FLOAT, ceiling_pixels3);
glTexImage2D(GL_TEXTURE_2D, 4, GL_RGB, ceiling_width4, ceiling_height4, 0, GL_RGB, GL_FLOAT, ceiling_pixels4);
glTexImage2D(GL_TEXTURE_2D, 5, GL_RGB, ceiling_width5, ceiling_height5, 0, GL_RGB, GL_FLOAT, ceiling_pixels5);
glTexImage2D(GL_TEXTURE_2D, 6, GL_RGB, ceiling_width6, ceiling_height6, 0, GL_RGB, GL_FLOAT, ceiling_pixels6);
glTexImage2D(GL_TEXTURE_2D, 7, GL_RGB, ceiling_width7, ceiling_height7, 0, GL_RGB, GL_FLOAT, ceiling_pixels7);
glTexImage2D(GL_TEXTURE_2D, 8, GL_RGB, ceiling_width8, ceiling_height8, 0, GL_RGB, GL_FLOAT, ceiling_pixels8);
Когда я использую текстуру, я использую
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,ceiling_texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT )
//draw primitives with texture coordinates
glDisable(GL_TEXTURE_2D);
Я использую точно такой же код и процедуру для «этажа».
Однако для потолка я получаю странный цветовой артефакт (желтый оттенок) на расстоянии, где он использует мипмапы низкого разрешения. (см. рисунок)
Я сгенерировал информацию о пикселях, используя glGetTexImage
применяется к разным версиям одного и того же файла с разными разрешениями, которые я генерировал, просто масштабируя изображение в GIMP. Я снова сделал то же самое для пола и потолка.
Когда я использовал glGenerateMipmap
этого не произошло
Почему я получаю этот артефакт и что я могу с этим поделать?
Urgh. Такая неутешительная причина. Оказывается, когда я уменьшал изображение в GIMP, оно использовало какое-то странное усреднение, которое для самого углового пикселя наименьшего изображения с разрешением (2×2) решило просто получить синий компонент совершенно неправильно (недооценивая его). Вручную принудили это к более разумному значению, и это работает теперь.