2
如果我在同一个绘图调用中有多个重叠的三角形,每个像素的像素着色器是否为每个像素输入一次?或者先执行深度测试,并且每个像素只着色一次,而不管原始数量是多少?在DirectX 9中,每个绘图调用每像素可以运行多于一次的像素着色器?
我正在使用DirectX 9并使用着色器模型4.0级别9_1。
谢谢!
如果我在同一个绘图调用中有多个重叠的三角形,每个像素的像素着色器是否为每个像素输入一次?或者先执行深度测试,并且每个像素只着色一次,而不管原始数量是多少?在DirectX 9中,每个绘图调用每像素可以运行多于一次的像素着色器?
我正在使用DirectX 9并使用着色器模型4.0级别9_1。
谢谢!
深度测试发生在像素着色器之后。见this question。另外,它清楚地表明像素着色器每像素运行多于一次。考虑alpha混合:不透明像素必须先渲染,然后透明像素与已渲染的不透明像素混合。如果像素着色器每个像素只输入一次,则不会发生这种情况。
“每个基元一次”不是正确的术语。单个基元最喜欢覆盖多个像素,因此单个基元会导致像素着色器针对基元覆盖的每个像素运行。
为防止像素着色器在被其他对象遮挡的图元上运行,必须实现某种形式的occlusion culling。或者,一些司机可能会在一定程度上为你做到这一点。请参阅下面的this link和注释。
如果像素着色器不修改像素的深度值,大多数驱动程序将进行早期深度测试,以避免遮挡像素(也称为“早期Z拒绝”)执行着色器。 – datenwolf 2013-03-18 20:50:33