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

Do DirectX Pixel Shaders Operate on Every Pixel of the Frame Like WPF Pixel Shaders?

根据我自己的反复试验经验,似乎 DirectX 像素着色器仅 运行 用于 pixels/fragments,它们在 DirectX 渲染的某些几何图元的范围内,而不是 运行 帧的像素只是清晰的颜色。

MSDN says:

Pixel shaders work in concert with vertex shaders; the output of a vertex shader provides the inputs for a pixel shader.

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

因此对于下图,DirectX像素着色器只会运行用于白色区域,因为它对应于顶点着色器输出的几何图元,但不适用于黑色区域,因为那是透明的颜色。另一方面,WPF 像素着色器对于帧的每个像素(白色和黑色)都是 运行。

这个理解对吗?

您的理解基本正确 - 像素着色器调用是由绘制图元(例如三角形)触发的。事实上,window 中的一个像素最终可能会调用多个像素着色器,例如,如果在第一个三角形之上绘制第二个三角形。这被称为 overdraw 并且通常是要避免的事情,最常见的避免方法是使用 z-culling.

如果要为window中的每个像素触发像素着色器,只需绘制两个组成"full screen quad"的三角形,即坐标(-1,-1)(1,1) ].在幕后,这就是 WPF 本质上所做的。