2012-03-21 2 views
3

Я хотел бы реализовать фильтрацию текстур (min и magfilter) сам в шейдере GLSL (так как я хочу использовать image_load_and_store, а не сэмплер, а также я хочу обрабатывать неопределенные пиксели в особым образом), и я ищу статью или так, чтобы обсудить процесс фильтрации.OpenGL/GLSL - реализация фильтрации текстур

Я могу вспомнить, как реализовать текстурирование из raytracer, который я когда-то писал, - я думаю, вам нужно учитывать УФ-градиенты на каждом пикселе и в зависимости от длины их как-то масштабировать ваш выборку растра .. но там я использовал 49-образное круговое ядро, я думаю, что это слишком тяжело.

Я думаю, что градиенты УФ-градиента я могу использовать с помощью dFdx() и dFdy(), но я хотел бы знать, каким образом ядро ​​openGL используется для фильтрации и реализует его в моем glsl-шейдере одинаково.

также - как отличить, требуется ли применять minfilter или magfilter? и процесс фильтрации отличается?

Последнее, но не менее важное: если его фильтрация минимизации, как выбрать соответствующий уровень mipmap на основе УФ-градиентов?

+1

Из любопытства, почему вы делаете это? – harold

+0

Обычно фильтрация текстур и выборка выполняются с использованием аппаратного обеспечения. Это определенно будет трудно, не говоря уже об эффективности, если она реализована в шейдере. – Ani

+0

Это графическое исследование, поэтому мы имитируем функции, которые в будущем могут поддерживаться аппаратными средствами. Я делаю это по двум причинам: во-первых, мне нужно использовать image_load_and_store (я не знаю, могу ли я использовать ту же текстуру, что и sampler, которую я также использую в качестве цели ImageStore?) Вторая причина заключается в том, что я хочу обрабатывать пиксели с помощью значение «NaN» особым образом (регулярная фильтрация будет делать весь пиксель NaN, если один из текселей - NaN) – user1282931

ответ

4

Там статья, над в Codeproject, который реализует различные фильтры (среди них билинейной) в GLSL: link

+0

это уже приятно, спасибо за это. Однако он обсуждает только прямоугольное масштабирование (что довольно тривиально), поэтому он не учитывает градиенты uv и mipMapping ... – user1282931

+1

Мипмапы обычно вычисляются автоматически с помощью функции, аналогичной функции '0.5 * log2 (fwidth())' (это _bit_ сложнее, например, настраиваемый смещение). Если вы нарисуете меньший квадратик, аппаратное обеспечение, как правило, автоматически выбирает меньшую мип-карту, и нет никакой «специальной фильтрации», которую вам в противном случае нужно будет сделать. Мипмапы, как правило, также фильтруются в коробке. Хотя существуют некоторые сложные фильтры фильтрации, люди, которые намного лучше в этом, чем вы и я, похоже, согласны с тем, что едва ли есть какое-либо видимое улучшение (но, вполне возможно, звонок). – Damon

+0

эй, это хорошая информация. поэтому, чтобы сделать это в шейдере правильно, я получу уровни mipmap 'floor (0.5 * log2 (fwidth()))' и 'потолок (0.5 * log2 (fwidth())), в каждом из которых вы выбираете 4 ближайших texels и интерполировать их билинейно, а затем смешивать между двумя значениями в соответствии с '(0.5 * log2 (fwidth()) - floor (0.5 * log2 (fwidth())))'? – user1282931