哪个坐标空间是每个着色器管道阶段的规范默认值?

时间:2013-07-25 14:04:05

标签: shader space hlsl directx-11

我正在使用Direct3D 11和HLSL。我使用四种不同的着色器(顶点,外壳,域和像素)。

我在着色器中使用正确的坐标空间总是遇到麻烦。有人可以为顶点,外壳,域和像素着色器阶段确定合适的空间吗?

3 个答案:

答案 0 :(得分:2)

您在任何着色器中使用的空间类型没有限制 - 您可以自由使用任何适合您目的的空间。事实上,在同一阶段内使用多个空间非常常见 - 例如,使用光源的世界空间坐标来计算像素着色器中的光照。唯一的要求是在剪辑空间中将SV_Position发送到光栅化器中,所以无论你最后阶段是光栅化还是需要这样做。

答案 1 :(得分:1)

通常,顶点会在补丁空间中流式传输到顶点着色器中,这是一种描述要细分的区域(补丁)的局部坐标系,但可能无法描述模型本身(多边形)。船体和域着色器可以处理这些补丁。外壳着色器在补丁空间中运行,而域着色器在补丁空间中运行一半,从外壳着色器控制点函数(控制点是"补丁级顶点")传递,并且在切线空间中一半贴片(即贴片的平面)。这允许您知道新顶点相对于补丁控制点的位置。完成细分后,如果没有几何着色器,模型可以位于投影空间中,如果有,则可以位于模型空间中。然后,几何着色器可以从模型中添加或减去顶点,将结果转换为投影空间,然后将它们传递给像素着色器。最后一个阶段,即像素着色器,通常在屏幕空间中运行(即,如果您查询SV_Position,它将在屏幕空间中)。

虽然这些很常见,但您也可以直接指定投影空间中的坐标(如果它对算法更方便),世界空间,局部空间,变换局部空间,切线空间,法线空间,光空间。 ..你真的喜欢什么。我列出了典型的管道空间,但这只是一个例子。它真的取决于你。

答案 2 :(得分:0)

这是我从Josh Petrie获得Gamedev的答案:

  • 顶点着色器从顶点缓冲区获取输入数据(即 通常在模型空间中),转换输入,并产生输出 剪辑空间中的数据。在顶点着色器阶段之后,透视 发生除(通过输出w坐标)。

  • 像素着色器处理片段而不是顶点,但是当您使用坐标时(例如通过SV_Position),那些 坐标在屏幕空间中(偏移0.5)。这意味着他们 范围从零到一。

  • 船体和域着色器对输入数据进行操作,并在同一空间内生成输出数据。因为输入数据是 通常在模型空间中,输出数据也在模型空间中。

那就是说,这些只是规范的默认值。由于您正在控制输入数据和输入数据的解释,因此您可以将该数据放在对您有用的任何坐标系中。例如,在3D API中伪造2D图形时,将像素坐标输入数据放入顶点缓冲区并使用非常简单的几乎无操作的顶点着色器非常有用。

虽然可编程控制之外的管道有一些方面。例如,SV_Position将始终是偏移屏幕空间。最值得担心的是它实际上是顶点着色器阶段的输出。管道的其余部分将假设输出位于剪辑空间中,执行裁剪,并通过w执行透视除法。因此,如果您想“避免”这种划分,您可能需要相应地设置w(通常为1.0)。

answers from gamedev