DirectX:像素着色器衍生计算

时间:2013-06-13 09:33:34

标签: directx sample pixel-shader derivative

据我所知,Pixel Shader基于每个像素运行。但是有ddxddy等函数可以计算派生。但是如何从一个像素坐标计算导数?有人可以帮我这些吗?这些也提出了问题,如

tex.Sample(s0, t0);

是否意味着每个像素计算样本函数?我认为Sampler Instruction在每个子跨度的基础上运行。

示例:

如果我有以下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像素坐标网格中调用上述代码的次数是多少? 感谢。

1 个答案:

答案 0 :(得分:2)

pixelhader是一个片段的程序。但是,所有像素都在2x2块内着色。对于这4个像素,像素着色器同时运行,因此可以有用于mipmapping等的计算衍生物。如果你正在调用tex.Sample,则调用相应块中的所有像素,因此可以确定渐变。这就是为什么梯度函数不能用于分支ifs或循环的原因,因为程序在fragment-quad中会有所不同。

有一个很好的描述如何使用mipmapping工作:http://www.arcsynthesis.org/gltut/Texturing/Tut15%20How%20Mipmapping%20Works.html

@您的编辑,应该通过我的链接来回答,但无论如何:我不确定它是如何实现的,但在最好的情况下,你的着色器将被运行16次。像素分组为2x2四边形。在边缘存在像素将被计算和丢弃的情况,但可能只有倾斜的边缘。