2013-06-13 58 views
0

就我所知,像素着色器以每个像素为基础运行。但是有一些功能,如ddxddy可以计算派生值。但是,如何从一个像素坐标计算出导数?有人可以帮我解决这些问题吗?这些也提出了问题,如在DirectX:像素着色器计算

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的像素坐标网格? 谢谢。

回答

2

pixelshader是一个片段的程序。但是,所有像素都在2×2块内阴影。 pixelhaders对于这4个像素是同时运行的,所以可以计算衍射图等等。如果你打电话tex.Sample它要求相应块中的所有像素,所以可以确定梯度。这就是为什么渐变函数不能用于分支if或循环的原因,因为程序在分片四元组中不同。

这是一个很好的说明了如何mipmapping贴图例如工作:http://www.arcsynthesis.org/gltut/Texturing/Tut15%20How%20Mipmapping%20Works.html

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