据我所知,Pixel Shader基于每个像素运行。但是有ddx
和ddy
等函数可以计算派生。但是如何从一个像素坐标计算导数?有人可以帮我这些吗?这些也提出了问题,如
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像素坐标网格中调用上述代码的次数是多少? 感谢。
答案 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四边形。在边缘存在像素将被计算和丢弃的情况,但可能只有倾斜的边缘。