DirectX像素着色器是否像WPF像素着色器一样在帧的每个像素上运行?

时间:2016-08-11 12:51:12

标签: wpf directx

根据我自己的试错经验,似乎DirectX像素着色器仅针对由DirectX渲染的某些几何图元的边界内的像素/片段运行,并且不针对简单的帧的像素运行清晰的颜色。

MSDN says

  

像素着色器与顶点着色器协同工作;顶点着色器的输出提供像素着色器的输入。

这与WPF像素着色器形成对比,WPF像素着色器是为帧的每个像素运行的,因为WPF不渲染3D基元,因此不知道或不关心它是什么意思是几何基元像素或清晰像素。

因此,对于下面的图像,DirectX像素着色器仅针对白色区域运行,因为它对应于顶点着色器输出的几何图元,但不对应于黑色区域,因为它是清晰的色彩。另一方面,WPF像素着色器将针对帧的每个像素运行,包括白色和黑色。

这种理解是否正确?

1 个答案:

答案 0 :(得分:1)

您的理解大多是正确的 - 通过绘制图元(例如三角形)触发像素着色器调用。实际上,如果例如在第一个三角形的顶部绘制第二个三角形,则窗口中的像素可能最终获得多于一个像素着色器调用。这被称为 overdraw ,通常是要避免的,最常见的避免方法是使用z-culling

如果要为窗口中的每个像素触发像素着色器,只需绘制两个构成“全屏四边形”的三角形,即坐标(-1,-1)(1,1)。在幕后,这就是WPF本质上所做的。