Текстурированное изображение OpenGL размыто

#opengl #textures #mipmaps

#opengl #Текстуры #mipmaps

Вопрос:

Я пытаюсь создать текстурированное изображение в формате mipmapped, которое представляет высоту. Изображение должно быть 940 x 618. Я понимаю, что моя текстура должна иметь ширину и высоту в степени 2. На данный момент я попытался постепенно выполнить все мои текстурирования в квадратах (например, 64 x 64 или 128 x 128, даже 512 x 512), но изображение по-прежнему получается размытым. Есть идеи, как лучше текстурировать изображение такого размера?

Ответ №1:

Используйте текстуру 1024×1024 и поместите свое изображение только в часть изображения, 940×618. Затем используйте значения 940,0 / 1024,0 и 618,0 / 1024,0 для максимальных координат текстуры или масштабируйте TEXTURE_MATRIX . Это приведет к отображению ваших пикселей в соотношении 1: 1. Вам также может потребоваться сдвинуть модель на полпикселя, чтобы получить идеальную подгонку, это зависит от настроек вашей модели и вида.

Это технология, которую я использовал в этой заставке, которую я сделал для Mac.http://memention.com/void/ Оно захватывает содержимое экрана и использует его в качестве текстуры для некоторых 3D эффектов, и я действительно хотел, чтобы пиксель идеально подходил.

Комментарии:

1. Хорошо, да, я думаю, моя проблема в том, что я не отображаю свои пиксели 1: 1. Использую ли я glMultiTexCoord2f() для установки максимальных координат текстуры? И должен ли я сделать это перед вызовом gluBuild2DMipmaps()? Спасибо за помощь!

2. Либо вы используете glTexCoord2f с новыми значениями, либо используете glMatrixMode(GL_TEXTURE); glScalef(*nv1*,*nv2*,1.0); glMatrixMode(GL_TEXTURE); ... draw your thing as before ...; reset texture matrix to identity

3. Вот код, который я использую. Кажется, ничего не работает. glEnable(GL_LIGHTING); glLightfv(…); glMatrixMode (GL_TEXTURE); glScalef(940.0/1024.0, 618.0/1024.0, 1.0); glMatrixMode(GL_TEXTURE); glDrawElements(…); glLoadIdentity(); glDisable (GL_LIGHTING);

4. Упс … извините, теперь увидел, что я использовал GL_TEXTURE дважды, должен был быть сброс в последнем glMatrixMode(..) ie на glMatrixMode(GL_MODELVIEW)

Ответ №2:

Насколько я знаю, современные технологии не требуют, чтобы вы использовали степень 2 для своих размеров. Однако просто знайте, что если этот код будет запущен на более старой машине, у вас возникнут некоторые проблемы. Сколько лет вашей машине?

Комментарии:

1. Определенно не старое. Есть идеи относительно того, почему оно будет размытым? Если я попытаюсь текстурировать все изображение, просто используя текстуру 128 x 128, оно будет очень размытым, если я использую текстуру 256 x 256, она станет менее размытой, и так далее…

2. @anthv123 Конечно, оно становится размытым, когда вы растягиваете его до размера, большего, чем текстура, или с другим соотношением сторон. Поэтому, если ваше оборудование не такое старое, просто попробуйте текстуру 940×618 и посмотрите, работает ли она. Вы можете посмотреть, поддерживает ли ваш драйвер GL_ARB_texture_non_power_of_two расширение (или, альтернативно, OpenGL 2.0).

3. Я пробовал использовать точную текстуру, но ничего лучше. Требуется ли для чего-либо ниже OpenGL 2.0 текстура мощностью 2?

4. Вы также можете попробовать отключить фильтрацию: glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Ответ №3:

Текстура, вероятно, не отображена 1: 1, и у вас фильтрация GL_LINEAR или GL_NEAREST. Попробуйте текстуры с более высоким разрешением, mipmapping и отображение экрана 1: 1.

Комментарии:

1. Кроме того, с любой видеокартой, отличной от Intel, вы можете просто использовать расширение TEXTURE_NON_POWER_OF_2 для загрузки текстуры любого размера. В этом случае вы можете просто сопоставить его с координатами в диапазоне от [0; 1], и оно должно соответствовать соотношению 1: 1.

Ответ №4:

Используйте текстуру размером 940×618 (если это действительно размер поверхности, к которой она применяется) и установите минимизацию / увеличение текстуры на использование GL_LINEAR. Это должно дать вам желаемые результаты.