DirectX 11 什么是片段?

DirectX 11 What is a Fragment?

我一直在学习 DirectX 11,在我正在阅读的书中,它指出 Rasterizer 输出 Fragments。据我了解,这些片段是光栅化器(输入几何基元)的输出,实际上只是 2D 位置(您的 2D 渲染目标视图)

以上是我的理解,还请指正

光栅化器采用几何基元(球体、立方体或盒子、环形 圆柱体、棱锥体、三角形网格或多边形网格)(https://en.wikipedia.org/wiki/Geometric_primitive)。然后它将这些图元转换为映射到渲染目标视图(即 2D)的像素(或点)。这就是片段。对于每个片段,它执行像素着色器,以确定其颜色。

但是,我只是假设,因为没有简单的解释(我能找到)。

所以我的问题是...

1:什么是光栅化器?输入是什么,输出是什么?

2:什么是片段,与光栅化器输出有关。

3:为什么片段是一个float 4值(SV_Position)?如果它只是渲染目标视图的 2D 屏幕 Space?

4:它与渲染目标输出(2D 屏幕纹理)有何关联?

5:这就是我们清除渲染目标视图(任何颜色)的原因,因为 Razterizer 和像素着色器不会在渲染目标视图的所有 X、Y 位置上执行吗?

谢谢!

我不使用 DirectXI,而是使用 OpenGL,但术语即使不相同也应该相似。我的理解是这样的:

(scene geometry)     -> [Vertex shader]               -> (per vertex data)
(per vertex data)    -> [Geometry&Teseletaion shader] -> (per primitive data)
(per primitive data) -> [rasterizer]                  -> (per fragment data)
(per fragment data)  -> [Fragment shader]             -> (fragment)
(fragment)           -> [depth/stencil/alpha/blend...]-> (pixels)

因此在顶点着色器中,您可以执行任何逐顶点操作,例如坐标系变换、所需参数的预计算等

在几何和曲面细分中,您可以从几何计算法线、emit/convert 图元等等。

Rasterizer 然后将几何体(原始)转换为片段。这是通过插值来完成的。它基本上将任何图元的查看部分分成片段,请参阅 convex polygon rasterizer

碎片不是像素也不是超像素,但它们接近它。不同之处在于它们可能会或可能不会输出,具体取决于环境和管道配置(像素是可见输出)。你可以把它们想象成一个可能的超像素。

片段着色器 将每个片段数据转换为最终片段。在这里,您正在计算每个 fragment/pixel 光照、阴影、处理所有纹理、计算颜色等。输出也是片段,基本上是像素 + 一些附加信息,因此它不仅有位置和颜色,还可以有其他属性(如更多颜色、深度、alpha、模板等)。

这进入最终组合器,它提供深度测试和任何其他启用的测试或功能,如混合。并且只有该输出作为像素进入 framebuffer

我认为回答了 #1,#2,#4

现在 #3(由于我对 DirectX 缺乏了解,我在这里可能是错误的)在您经常需要的每个片段数据中3D 片段的位置以进行适当的照明或进行任何计算,并且使用 我们需要 4D (x,y,z,w) 向量。片段本身有 2D 坐标,但 3D 位置是它从顶点着色器传递的几何体的插值。因此它可能不包含屏幕位置,而是包含世界坐标(或任何其他坐标)。

#5 是的,场景可能不会覆盖整个屏幕,或者您需要预设深度、模板、Alpha 等缓冲区,以便渲染正常工作并且不会因前一帧的结果。所以我们通常需要在帧开始时清除帧缓冲区。有些技术需要每帧多次清除其他技术(如发光效果)每多帧清除一次 ...