Смущенный о поколении mipmap в металле? - PullRequest
2 голосов
/ 27 марта 2019

Я устанавливаю mipmapped в YES в texture2DDescriptorWithPixelFormat и вызываю generateMipmapsForTexture метод MTLBlitCommandEncoder для данной текстуры, чтобы автоматически генерировать мипмапы.

Вопрос в том, что если я установил mipmapped на YES, разве это не означает, что результирующее изображение должно отображаться в виде мипа, зачем мне нужен MTLBlitCommandEncoder для явной генерации мипакарт?

1 Ответ

1 голос
/ 27 марта 2019

Это немного сбивает с толку, так что давайте пройдемся по нему.

texture2DDescriptorWithPixelFormat принимает format, width, height и mipmapped в качестве параметров. Параметр mipmapped предназначен для того, чтобы Металл вычислил количество уровней mip, которое будет иметь результирующее изображение, поскольку нет параметра для передачи количества уровней mip. Вот как это описано в документации:

mipmapped

A Boolean указывает, должно ли полученное изображение быть мип. Если YES, то свойство mipmapLevelCount в возвращаемом дескриптор вычисляется из width и height. Если NO, то mipmapLevelCount is 1.

Если бы вы использовали newTextureWithDescriptor с дескриптором текстуры, который вы создали явно, то параметра mipmapped нет, поскольку вы явно передаете число уровней mip в свойстве mipmapLevelCount MTLTextureDescriptor.

Поскольку вы создаете новую текстуру, нет смысла генерировать мипмапов, так как текстура пуста.

Метод generateMipmapsForTexture используется для создания мипмапов для текстуры, у которой уже имеет уровни мипов, и вам просто нужно заполнить их мипмапами, сгенерированными автоматически.

Итак, чтобы получить это прямолинейное значение, параметр mipmapped просто говорит Metal создать текстуру, имеющую уровни mip, которую вы можете позже заполнить (если хотите) generateMipmapsForTexture (или другими способами, такими как использование текстура как цветовая привязка в проходе рендеринга с указанным уровнем)

...