DirectX: вычисление производных пиксельных шейдеров

Насколько я понимаю, Pixel Shader работает попиксельно. Но есть такие функции, как ddx и ddy, которые вычисляют производные. Но как можно вычислить производные только от координат одного пикселя?? Может ли кто-нибудь помочь мне в этом? Это также вызывает вопросы, как в

tex.Sample(s0, t0);

Означает ли это, что функция Sample рассчитывается для каждого пикселя?? Я думал, что инструкция сэмплера работает на основе поддиапазона.

Пример:

Если у меня есть следующие 16 пикселей:

* * * *
* * * *   
* * * *
* * * *

И мой пиксельный шейдер выглядит так:

float4 PS(PS_INPUT input) : SV_Target{
    float2 derivX = ddx_fine(input.tex);
    float2 derivY = ddx_fine(input.tex);

    return tex.SampleGrad(s0, t0, derivX, derivY);
}

Сколько раз приведенный выше код будет вызываться в сетке пиксельных координат 4 x 4? Спасибо.


person Rachit Agrawal    schedule 13.06.2013    source источник


Ответы (1)


Пиксельшейдер — это программа ровно для одного фрагмента. Но все пиксели заштрихованы в блоке 2x2. Пиксельные шейдеры работают одновременно для этих 4 пикселей, поэтому можно вычислить производные для мип-мэппинга и т. д. Если вы вызываете tex.Sample, он вызывается для всех пикселей в соответствующем блоке, поэтому можно определить градиент. По этой причине градиентные функции нельзя использовать в ветвящихся ifs или циклах, потому что программа будет отличаться внутри фрагмента-квадрата.

Например, есть хорошее описание того, как работает мипмэппинг: http://www.arcSynthesise.org/gltut/Texturing/Tut15%20How%20Mipmapping%20Works.html

@ Ваше редактирование, на которое должна ответить моя ссылка, но в любом случае: я не уверен, как оно реализовано, но в лучшем случае ваш шейдер будет запущен 16 раз. Пиксели сгруппированы в квадраты 2x2. На краях бывают случаи, когда пиксели будут вычисляться и отбрасываться, но, возможно, только с перекошенными краями.

person Gnietschow    schedule 13.06.2013