PNG изображения размыты при нагрузке на текстуру

StackOverflow https://stackoverflow.com/questions/2724145

Вопрос

Я создал изображение PNG в Photoshop с прозрачными пленками, которые я загрузил в программу OpenGL. Я привязал его к текстуре и в программе картина выглядит размытым, и я не уверен, почему.

Alt Text http://img685.imageshack.us/img685/9130/upload2.png.

Alt Text http://img695.imageshack.us/img695/2424/upload1e.png.

Загрузка кода

// Texture loading object
nv::Image title;

// Return true on success
if(title.loadImageFromFile("test.png"))
{
    glGenTextures(1, &titleTex);
    glBindTexture(GL_TEXTURE_2D, titleTex);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}

else
    MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);

Показать код

glEnable(GL_TEXTURE_2D);    
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);

glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
    glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
    glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);    
glDisable(GL_TEXTURE_2D);

Редактировать: я не думаю, что я растянув каждый пиксель должен быть два в координате

int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
Это было полезно?

Решение

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

Вы, по-видимому, просто хотите отобразить свое растровое изображение без какого-либо масштабирования, не обернув его на поверхность другого объекта или что-то подобное (т. Е. Любая из текстурных вещей предназначена для). Что бы дело, я просто поставил его как растровое изображение, а не текстуру (например, см. glRasterPos2i а также glBitmap).

Другие советы

Почему вы хотите использовать MiPMapping и анизотропную фильтрацию для статического изображения на вашем запуска в первую очередь? Он выглядит в маловероятно, изображение будет поворачиваться (то, на что предназначена анизотропная фильтрация) или должна быть изменена, много раз просто быстрое (какое mipmapping для).

Если текстура растягивается: попробуйте использовать GL_NEAREST для тебя GL_MAG_FILTER, в этом случае он может дать лучшие результаты (GL_LINEAR более точен, но имеет природу размытия).

Если текстура минимизируется: то же самое, попробуйте использовать GL_NEAREST_MIPMAP_NEAREST, или даже лучше, попробуйте использовать никаких MIPMAPS и GL_NEAREST (или GL_LINEAR, в зависимости от того, что дает вам лучший результат).

Я бы посоветовал, что вы заставляете PNG иметь разрешение в силу 2-х годов. Т.е. 1024x512 и поместите деталь, которую вы хотите нарисовать в верхнем левом углу, все еще в разрешении для экрана. Затем Rescale Texcoords составляют 800,0 / 1024,0 и 600,0 / 512,0, чтобы получить правильную часть из текстуры. Я верю, что происходит, это glTexImage2D Может когда-нибудь обрабатывать ширину и высоту, которая не является мощностью 2, но затем может масштабировать входное изображение таким образом фильтровать его.

Пример обращения с этим можно посмотреть здесь (iPhone - OvenGles - Project, который захватывает часть экрана не мощность 2 и рисует, что в текстуру 512x512 и отставок GL_TEXTURE Матрица, линия 123, вместо того, чтобы выполнять ручную вскакание Texcoords)

Здесь Это еще один пост, упоминающий этот метод.

Вот гипотеза:

Ваше окно 800x600 (и, возможно, ваш кадр тоже), но ваша клиентская область не является из-за украшения окна по бокам.

Таким образом, ваш фрейм-буфер изменяется в сборе при сборе клиентской области вашего окна. Можете ли вы проверить код создания окна?

  • Остерегайтесь точного размера клиентской области вашего окна. Дважды проверьте, что вы ожидаете, что это будет
  • Остерегайтесь правил выравнивания пикселей. Возможно, вам может потребоваться добавить 0,5 к своим координатам X / Y, чтобы ударить центры пикселей. Описание для DirectX можно найти здесь - Правила OpenGL могут быть разными, хотя.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top