2011-12-20 2 views
4

Когда я рисую текстуру в пиксельном шейдере, блоку текстуры нужно выбрать mipmap на основе градиента текстуры вокруг затененного пикселя.HLSL tex2D() - откуда берется градиент?

Там есть функция tex2Dgrad(), которая позволяет мне поставить информацию о градиенте вручную и tex2Dlod(), который позволяет мне выбрать MIPMAP вручную, но если я просто позвонить tex2D() тогда где же дополнительная информация градиента взялась?

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

Я хочу использовать текстуру в виде таблицы перекодировки в пиксельном шейдере с использованием вычисленных U и V координаты, но я не хочу любые неожиданные «магия» происходит в tex2D().

Нужно ли использовать tex2Dlod(), чтобы избежать этого? Я читал, что tex2Dlod() медленнее, чем tex2D().

+0

Он исходит из «магии», аналогичной «ddx» и «ddy», применяемой к компоненту глубины – harold

+0

Гарольд ... В отличие от глубины, он не может быть основан на каких-либо входах с этапа вершины. Я могу вычислить произвольную координату текстуры (u, v) в пиксельном шейдере, и mipmapping все еще работает. – Jinstarr

+0

Координата u, v не влияет на уровень mip, хотя – harold

ответ

1

Графические адаптеры выделяют «квадрат» 4 пикселя за раз, а градиенты, используемые для получения текстур, исходят из конечных разностей, вычисленных из смежных пар пикселей. Именно так GPU может генерировать частные производные даже для произвольных выражений в пиксельном шейдере. Функция tex2Dgrad может быть полезна, если вы можете рассчитать более точные аналитические производные для значений, которые вы передаете в качестве координат текстуры.

+0

Я нашел документ, который частично объясняет процесс : http://developer.amd.com/media/gpu_assets/04%20clever%20shader%20tricks.pdf – Jinstarr

Смежные вопросы