OpenGL Mipmapping: как OpenGL определяет уровень карты? - PullRequest
3 голосов
/ 25 мая 2010

У меня проблемы с реализацией mipmapping в OpenGL. Я использую OpenFrameworks и изменил класс ofTexture для поддержки создания и рендеринга mipmaps.

Следующий код является исходным кодом создания текстуры из класса (слегка измененным для ясности):

  glEnable(texData.textureTarget);
      glBindTexture(texData.textureTarget, (GLuint)texData.textureID);
      glTexSubImage2D(texData.textureTarget, 0, 0, 0, w, h, texData.glType, texData.pixelType, data);
      glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
      glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glDisable(texData.textureTarget);

Это моя версия с поддержкой mipmap:

  glEnable(texData.textureTarget);
       glBindTexture(texData.textureTarget, (GLuint)texData.textureID);
       gluBuild2DMipmaps(texData.textureTarget, texData.glTypeInternal, w, h, texData.glType, texData.pixelType, data);
       glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
       glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  glDisable(texData.textureTarget);

Код не генерирует ошибок (gluBuild2DMipmaps возвращает '0') и текстуры отображаются без проблем. Однако я не вижу никакой разницы.

Сцена, которую я рендеринг, состоит из "плоских, квадратных плиток" при z = 0. Это в основном 2D-сцена. Я увеличиваю и уменьшаю масштаб с помощью «glScale ()» перед рисованием плиток. Когда я уменьшаю масштаб, пиксельные текстуры начинают «танцевать», что указывает (насколько я могу судить) на поиск нефильтрованной текстуры. См .: http://www.youtube.com/watch?v=b_As2Np3m8A в 25 с.

Мой вопрос: поскольку я не перемещаю положение камеры, а использую только масштабирование всей сцены, означает ли это, что OpenGL не может выбрать соответствующий уровень mipmap и использует полный размер текстуры (уровень 0)?

Пол

Ответы [ 2 ]

1 голос
/ 25 мая 2010

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

Вы устанавливаете GL_LINEAR_MIPMAP_LINEAR, когда вы также визуализируете свои плитки? Это имеет значение только при рендеринге, а не при создании / загрузке текстуры. Возможно, вам также необходимо переместить вызовы в скобки glEnable / glDisable, в зависимости от того, в каком состоянии вы там находитесь.

0 голосов
/ 25 мая 2010

Возможно, вам следует переключиться на автоматическое создание mipmap , если вы нацеливаетесь на OpenGL> = 1.4.

Вы можете попытаться изменить GL_TEXTURE_MIN/MAX_LOD, чтобы вызвать определенный уровень MIP.

...