0

据我了解像素着色器在每个像素的基础上运行。但也有类似ddxddy计算导数的函数。但是,如何仅从一个像素坐标计算导数呢?有人可以帮我解决这些问题吗?这些也提出了问题,如

tex.Sample(s0, t0);

这是否意味着样本函数是按像素计算的?我认为采样器指令在每个子跨度的基础上运行。

例子:

如果我有以下 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 像素坐标网格中调用多少次?谢谢。

4

1 回答 1

3

像素着色器是针对一个片段的程序。但是,所有像素都在 2x2 块内着色。对于这 4 个像素,像素着色器同时运行,因此可以计算 mipmapping 等的导数。如果您调用tex.Sample它,则会针对相应块中的所有像素调用它,因此可以确定梯度。这就是为什么梯度函数不能用于分支 if 或循环的原因,因为程序在片段四边形中会有所不同。

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

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

于 2013-06-13T10:54:19.887 回答