2014-11-06 2 views
0

Я использую текстуры в OpenGL (в FLTK с C++) и использую mipmaps. Я делаю многоплатформенный проект (текущее кодирование в Mac), но я не хочу использовать расширения в Windows, поэтому я не использую glGenerateMipmap и поэтому решил сделать их вручную. Я делаю это в этом примере для «пола» и «потолка». Я использую следующий код для загрузки данных из различных версий разрешения изображенияmipmap color artefact в OpenGL

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); 

Я использую тот же код и порядок «пола».

Однако для потолка я получаю странный цветной артефакт (желтый оттенок) на расстоянии, где он использует мипмапы низкого разрешения. (Смотри рисунок)

Yellow artefact in ceiling

Я генерируемую информацию пикселя с помощью glGetTexImage применительно к различным версиям одного и того же файла в различных разрешениях я порожденного только масштабирование изображения в GIMP. Снова я сделал то же самое для пола и потолка.

Когда я использовал glGenerateMipmap, этого не произошло.

Почему я получаю этот артефакт и что я могу с ним поделать?

ответ

1

Urgh. Такая неутешительная причина. Оказывается, когда я масштабировал изображение в GIMP, он использовал какое-то странное усреднение, которое для самого углового пикселя изображения с наименьшим разрешением (2x2) решило просто полностью исключить синий компонент (недооценивать его). Вручную заставили это более разумную ценность, и она работает сейчас.

Смежные вопросы