2015-04-12 3 views
2

(я делаю это в Apple, Metal, но я думаю, что вопрос относится к OpenGL и DirectX тоже. Примеры кода из металла или OpenGL очень приветствуется.)Как декодирует текстуру

У меня есть одна текстуры smallTex размер которого кратен размеру другой текстуры bigTex.

Например, smallTex имеет размеры 32x32 и bigTex имеет 128x128.

мне нужно декодируют содержимое bigTex в smallTex так, что каждый пиксель в smallTex содержит средние значения соответствующих пикселей в bigTex.

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

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

Я читал, что это можно сделать, используя мипмапы (которые по существу представляют собой уменьшенные копии исходной текстуры). Но тогда мне пришлось бы включить mipmapping на bigTex, что окажет отрицательное влияние на производительность, так как я делаю много шагов рендеринга (вычислений) на bigTex, что приведет к большой работе для GPU для обновления mipmaps.

Что мне нужно - это прямая команда графического процессора для уменьшения размера текстуры.

Возможно ли это? Любые намеки?

ответ

0

Линейная фильтрация в методе Metal texture2d.sample() может делать ограниченную понижающую дискретизацию прямо в вашем ядре, но это линейная фильтрация, и данные могут начать теряться, когда коэффициент понижающей дискретизации больше 2. Вы можете, конечно, используйте этот метод в повторных проходах вниз по показателям по два до тех пор, пока вы не приблизитесь.

Другой метод - MPSImageLanczosScale, который будет выполнять повторную выборку Lanczos. Как правило, это будет выглядеть намного лучше для фотографических изображений, но может быть плохим выбором для векторного искусства и другого контента с множеством точных ребер. В таких случаях вы увидите звонки из ядра lanczos windowed sinc().

Этот звонок также может вызывать проблемы для фильтров распознавания изображений нейронных сетей, поскольку сигнал звонка может быть ошибочно принят за контент (например, волосы) и вызывает проблемы для точности сети. Как правило, однако, обучение в сети - это то, как вы должны ее использовать.

MPS также предоставляет MPSImagePyramid для генерации мипмапов.