光栅化规则
光栅化规则定义如何将矢量数据映射到光栅数据。 光栅数据贴靠到整数位置,然后剔除和剪裁(以绘制最小像素数),并在传递到像素着色器之前(从每顶点属性)内插每像素属性。
有多种类型的规则,具体取决于要映射的基元类型,以及数据是否使用多重采样来减少别名。 下图演示了如何处理角情况。
三角形光栅化规则(无多重采样)
绘制位于三角形内的任何像素中心;如果像素通过左上角规则,则假定像素位于内部。 左上角规则是,如果像素中心位于三角形的上边缘或三角形的左边缘,则定义为位于三角形内部。
哪里:
- 上边缘是一个完全水平且高于其他边缘的边缘。
- 左边缘是一个不完全水平且位于三角形左侧的边缘。 三角形可以有一个或两个左边缘。
左上角规则可确保绘制相邻三角形一次。
此图显示了绘制的像素示例,因为它们位于三角形内或遵循左上角规则。
插图
像素的浅灰色和深灰色覆盖将它们显示为像素组,以指示它们所在的三角形。
线条光栅化规则(别名,无多重采样)
线条光栅化规则使用菱形测试区域来确定线条是否覆盖像素。 对于 x 主线(-1 <= 斜率 <= +1),钻石测试区域包括(显示实心)左下边缘、右下边缘和下角;菱形排除(显示虚线)左上角、右上角、上线线、左角和右角。 y 主线是不是 x 主线的任何行;测试菱形区域与 x 主线描述的相同,但右侧角也包括在内。
给定菱形区域时,如果线条从开始到终点沿线移动时退出像素的钻石测试区,则线条将覆盖像素。 线条条的行为相同,因为它被绘制为一系列线条。
下图显示了一些示例。
线条光栅化规则 (抗锯齿,无多重采样)
抗锯齿线被光栅化,就像它是一个矩形(宽度 = 1)。 该矩形与生成每像素覆盖率值的呈现目标相交,这些值乘以像素着色器输出 alpha 组件。 在多采样呈现目标上绘制线条时,没有预制的抗锯齿。
被认为没有执行抗锯齿线呈现的单一“最佳”方法。 Direct3D 10 采用如下图中所示的方法指南。 此方法从经验上派生,展示了一些被视为可取的视觉属性。 硬件不需要与此算法完全匹配;针对此参考的测试应具有“合理的”容差,由下面列出的一些原则指导,允许各种硬件实现和筛选器内核大小。 但是,硬件实现中不允许这种灵活性,只能通过 Direct3D 10 向应用程序传达,而不仅仅是绘制线条和观察/测量它们的外观。
反锯齿线光栅化示例的
此算法生成相对平滑的线条,其强度统一,边缘或编织最小。 关闭线的 Moire 模式最小化。 线段之间放置的端到端线段之间有良好的覆盖面。 筛选器内核是边缘模糊量与伽玛更正导致的强度变化之间的合理权衡。 覆盖率值按以下公式乘以像素着色器 o0.a(srcAlpha),按输出合并阶段:srcColor * srcAlpha + destColor * (1-srcAlpha)。
点光栅化规则(无多重采样)
一个点被解释为它由 Z 模式中的两个三角形组成,该三角形使用三角形光栅化规则。 该坐标标识一个像素宽方形的中心。 积分没有剔除。
下图显示了一些示例。
点光栅化插图
多重采样抗锯齿光栅化规则
多重采样抗锯齿(MSAA)使用像素覆盖率和多个子样本位置的深度模具测试来减少几何图形别名。 为了提高性能,通过跨覆盖的子像素共享着色器输出,为每个覆盖的像素执行一次每像素计算一次。 多重采样抗锯齿不会减少表面锯齿。 示例位置和重建功能依赖于硬件实现。
下图显示了一些示例。
多采样抗锯齿光栅化示例的
示例位置的数量取决于多重采样模式。 顶点属性在像素中心内插,因为这是调用像素着色器的位置(如果中心未覆盖,这将成为推断)。 属性可以在像素着色器中标记为质心采样,这会导致非覆盖像素在像素区域和基元交集处内插属性。 每个 2x2 像素区域的像素着色器运行以支持派生计算(使用 x 和 y 增量)。 这意味着,着色器调用的发生时间超过显示以填充最小 2x2 quanta(独立于多重采样)。 着色器结果针对通过每样本深度模具测试的每个涵盖样本写出。
基元的光栅化规则通常与多重采样抗锯齿保持不变,但以下情况除外:
对于三角形,将针对每个样本位置(而不是像素中心)执行覆盖测试。 如果覆盖了多个示例位置,则像素着色器运行一次,并在像素中心内插属性。 结果存储在通过深度/模具测试的像素中每个覆盖的样本位置(复制)。
线条被视为由两个三角形组成的矩形,线条宽度为 1.4。
对于某个点,对每个样本位置(而不是像素中心)执行覆盖测试。
许多格式支持多重采样(请参阅 direct3D 10 格式 硬件支持),可以解析某些格式(ResolveSubresource;这会将多采样格式向下采样为 1 的示例大小)。 多重采样格式可用于呈现目标,这些目标可以使用 加载读回着色器,因为着色器访问的各个样本不需要解析。 多重采样资源不支持深度格式,因此深度格式仅限于呈现目标。
无类型格式(例如R8G8B8A8_TYPELESS)支持多重采样,以允许资源视图以不同的方式解释数据。 例如,可以使用R8G8B8A8_TYPELESS创建多采样资源,使用具有R8G8B8A8_UINT格式的呈现目标视图资源将其呈现,然后使用R8G8B8A8_UNORM数据格式将内容解析为另一个资源。
硬件支持
API 报告通过质量级别进行多重采样的硬件支持。 例如,0 质量级别意味着硬件不支持多重采样(在特定格式和质量级别)。 质量级别的 3 表示硬件支持三种不同的示例布局和/或解析算法。 还可以假设以下各项:
- 任何支持多重采样的格式,都支持该系列中每个格式的相同质量级别。
- 支持多重采样且具有_UNORM、_SRGB、_SNORM或_FLOAT格式的每个格式也支持解析。
多重采样抗锯齿时属性的质心采样
默认情况下,顶点属性在多重采样抗锯齿期间内插到像素中心;如果未覆盖像素中心,则属性将推断为像素中心。 如果包含质心语义(假设像素未完全覆盖)的像素着色器输入将在像素的覆盖区域内的某个位置采样,可能位于其中一个覆盖的样本位置。 在质心计算之前应用样本掩码(由光栅器状态指定)。 因此,屏蔽的样本不会用作质心位置。
参考光栅器为质心采样选择一个示例位置,如下所示:
- 示例掩码允许所有样本。 如果覆盖了像素,或者未覆盖任何样本,请使用像素中心。 否则,从像素中心开始,选择第一个覆盖的样本,然后向外移动。
- 示例掩码会关闭除一个示例(一种常见方案)外的所有示例。 应用程序可以通过循环访问单位样本掩码值,并使用质心采样重新呈现每个样本的场景来实现多通道超级采样。 这将要求应用程序调整派生体,以便为更高的纹理采样密度选择合适的更详细的纹理 mips。
多重采样时的衍生计算
像素着色器始终使用最小 2x2 像素区域运行,以支持派生计算,这些计算方法是从相邻像素获取数据之间的增量(假设每个像素中的数据已水平或垂直采样单位间距)。 这不受多重采样影响。
如果对已采样质心的属性请求派生体,则不会调整硬件计算,这可能会导致不准确的衍生值。 着色器预期呈现目标空间中的单位向量,但可能会获得相对于其他一些向量空间的非单元向量。 因此,当请求从质心采样的属性中请求派生时,应用程序有责任谨慎行事。 事实上,建议不要合并衍生产品和质心采样。 质心采样对于基元的内插属性未推断至关重要的情况非常有用,但这附带了利弊,例如,在基元边缘跨越像素(而不是持续更改)或派生 LOD 的纹理采样作不能使用的派生体时,这些特性似乎会跳跃。
相关主题