我一直在学习DirectX 11,在我正在阅读的书中,它指出Rasterizer会输出Fragments。我的理解是,这些碎片是光栅化器的输出(输入几何图元),实际上只是2D位置(你的2D渲染目标视图)
以下是我认为理解的内容,请纠正我。
光栅化器采用几何图元(球体,立方体或盒子,环形) 圆柱体,金字塔,三角形网格或多边形网格)(https://en.wikipedia.org/wiki/Geometric_primitive)。然后,它将这些基元转换为映射到渲染目标视图(即2D)的像素(或点)。这就是片段。对于每个片段,它执行像素着色器,以确定其颜色。
然而,我只是假设,因为没有简单的解释它是什么(我能找到)。
所以我的问题是......
1:什么是光栅化器?什么是输入,输出是什么?
2:与Rasterizer输出相关的片段是什么。
3:为什么片段是浮点4值(SV_Position)?如果它只是渲染目标视图的2D屏幕空间?
4:它如何与渲染目标输出(2D屏幕纹理)相关?
5:这就是我们清除渲染目标视图(任何颜色)的原因,因为Razterizer和Pixel Shader不会在渲染目标视图的所有X,Y位置上执行?
谢谢!
答案 0 :(得分: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)
因此,在顶点着色器中,您可以执行任何每个顶点操作,如坐标系变换,预先计算所需参数等。
在几何和teselation中,您可以从几何,发射/转换基元等计算法线。
光栅化器然后将几何体(基元)转换为片段。这是通过插值完成的。它基本上将任何原语的被观察部分划分为片段,参见convex polygon rasterizer。
片段不是像素也不是超级像素,但它们接近它。不同之处在于它们可能会或可能不会输出,具体取决于环境和管道配置(像素是可见输出)。您可以将它们视为可能的超像素。
片段着色器将每个片段数据转换为最终片段。在这里你计算每个片段/像素光照,着色,做所有纹理的东西,计算颜色等。输出也是片段,基本上是像素+一些额外的信息,所以它不只是位置和颜色,但可以有其他属性如好吧(比如更多的颜色,深度,阿尔法,模板等)。
这将进入最终组合器,它提供深度测试和任何其他启用的测试或功能,如混合。只有那个输出作为像素进入 framebuffer 。
我认为这回答了#1,#2,#4 。
现在#3 (由于我对 DirectX 缺乏了解),我经常需要 3D 片段的位置适当的照明或任何计算和使用homogenuous coordinates我们需要 4D(x,y,z,w)向量。片段本身具有 2D 坐标,但 3D 位置是从Vertex着色器传递的几何体的插值。因此它可能不包含屏幕位置,而是包含世界坐标(或任何其他坐标)。
#5 是的,场景可能无法覆盖整个屏幕,或者您需要预设缓冲区,如深度,模板,Alpha,以便渲染按原样运行,并且不会被之前的帧结果无效。所以我们需要通常在帧开始时清除帧缓冲区。有些技术需要每帧多次清除其他(如发光效果)每多帧清除一次......