DirectX 像素着色器是否像 WPF 像素着色器一样在帧的每个像素上运行?
Do DirectX Pixel Shaders Operate on Every Pixel of the Frame Like WPF Pixel Shaders?
根据我自己的反复试验经验,似乎 DirectX 像素着色器仅 运行 用于 pixels/fragments,它们在 DirectX 渲染的某些几何图元的范围内,而不是 运行 帧的像素只是清晰的颜色。
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 本质上所做的。
根据我自己的反复试验经验,似乎 DirectX 像素着色器仅 运行 用于 pixels/fragments,它们在 DirectX 渲染的某些几何图元的范围内,而不是 运行 帧的像素只是清晰的颜色。
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 本质上所做的。