【问题标题】:Do DirectX Pixel Shaders Operate on Every Pixel of the Frame Like WPF Pixel Shaders?DirectX 像素着色器是否像 WPF 像素着色器一样对帧的每个像素进行操作?
【发布时间】:2016-08-11 12:51:12
【问题描述】:

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

MSDN says:

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

这与 WPF 像素着色器形成对比,后者针对帧的每个像素运行,因为 WPF 不渲染 3D 图元,因此不知道也不关心几何图元像素意味着什么或清晰 -颜色像素。

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

这种理解正确吗?

【问题讨论】:

  • 如果我没记错我的大学课程(2 年前),你有一个顶点着色器和一个像素着色器。您传递到顶点着色器,然后传递到像素着色器,所以是的,在该部分中,您仅将效果应用于该几何体中的像素。如果您希望像素着色器影响整个场景,那么您可以在纹理上传递整个场景。所以如果你考虑一下,在这种情况下你确实传递了一个方形几何体

标签: wpf directx


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这正是我想要的! :)
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多