2016-08-11 201 views
0

从我自己的反复试验经验来看,DirectX像素着色器似乎只运行在由DirectX呈现的某些几何图元边界内的像素/片段,并且不运行于仅仅是帧的像素清晰的色彩。DirectX像素着色器在帧的每个像素上都像WPF像素着色器一样操作吗?

MSDN says

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

此鲜明对比WPF像素着色器,它们是为框架的每个像素运行,因为WPF不会呈现3D图元,因此并不知道也不关心它的意思是一个几何原始像素或清晰的像素。

因此,对于以下图像,DirectX像素着色器只能在白色区域运行,因为它对应于顶点着色器输出的几何图元,但不是黑色区域,因为这是纯色。另一方面,WPF像素着色器将针对帧的每个像素(白色和黑色)运行。

这是理解是否正确?

+0

如果我在我的大学课程(2年前)中没有记错的话,那么您同时拥有一个顶点着色器和一个像素着色器。你传递到顶点着色器,然后通过像素着色器,所以是在那部分你只对那个几何体中的像素应用效果。如果你希望像素着色器能够影响整个场景,那么你就可以在整个场景中传递纹理。所以如果你仔细想一想,在这种情况下,你确实要传递一个正方形的几何图形 – Sam

回答

1

你的理解大多是正确的 - 像素着色器调用是通过绘制基元(例如三角形)触发的。实际上,如果在第一个顶点上绘制第二个三角形,则窗口中的像素最终可能会获得多个像素着色器调用。这被称为透支并且通常是应该避免的,最常用的避免方法是使用z-culling

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

+0

谢谢,这就是我一直在寻找的东西! :) – artisticdude