【问题标题】:DirectX 11 What is a Fragment?DirectX 11 什么是片段?
【发布时间】:2017-10-02 17:20:27
【问题描述】:

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

以下是我认为我理解的,请纠正我。

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

但是,我只是假设,因为没有简单的解释说明它是什么(我可以找到)。

所以我的问题是......

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

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

3:为什么片段是浮点 4 值(SV_Position)?如果它只是用于渲染目标视图的 2D 屏幕空间?

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

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

谢谢!

【问题讨论】:

  • 我建议你看一些关于 3D 计算机图形学的经典教科书。您缺少对所有 3D 管道如何工作的基本了解。掌握了这些背景后,您就可以了解 Direct3D API 如何准确地映射到经典 3D 管道,并让您更深入地了解硬件如何加速它。我不再编写软件纹理三角形扫描例程——而且从来没有特别擅长它们——但即使是糟糕的软件实现也会教你很多这里发生的事情。
  • 这里的经典教材是Foley and vam DamHearn and Baker 很好,Watt 的书也很好。
  • @ChuckWalbourn 谢谢!您是否推荐这些旧书,或获得任何升级版?我正在寻找一些我猜在通用 Directx 书籍中不存在的答案。不幸的是,在我有“AHA”时刻之前,我需要知道某些东西起作用的原因。
  • 这取决于您真正想知道自己在做什么 :) 如果您想成为一名图形开发人员,那么您应该阅读其中一本旧书以获得良好的基础,而不是而不是过分关注特定技术的 API 怪癖。当然,这完全取决于你的学习方式。如果您想要一些关于 DirectX 书籍的建议/注释,请参阅this post
  • @ChuckWalbourn 你会按什么顺序阅读它们? (对于未来的读者,是的,我刚刚得到它们!)

标签: rendering directx-11 hlsl pixel-shader


【解决方案1】:

我不使用 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)

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

在几何和细分中,您可以从几何计算法线、发射/转换图元等等。

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

片段既不是像素也不是超像素,但它们接近于它。不同之处在于它们可能会或可能不会输出,具体取决于环境和管道配置(像素是可见输出)。您可以将它们视为可能的超像素。

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

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

我认为答案是 #1,#2,#4

现在 #3(由于我对 DirectX 的了解不足,我可能在这里错了)您经常需要 3D 的每个片段数据正确照明或任何计算的片段位置以及使用homogenuous coordinates 我们需要 4D (x,y,z,w) 向量。片段本身具有 2D 坐标,但 3D 位置是其从顶点着色器传递的几何图形的插值。所以它可能不包含屏幕位置,而是包含世界坐标(或任何其他)。

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

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2018-03-11
    • 2014-08-20
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多