之前的几篇翻译都烂尾了,这篇希望。。。。能好些,恩,还有往昔呢。
------------------------------------------------------------
第十部分
译:minggoddess
欢迎回来。上一次,我们一头扎进了像素管线的最底端。这次,切换到管线的中间位置看一下伴随D3D10而来的大概是最引人注目扩展:几何着色器(Geometry Shaders)。
但首先呢,我会先讲一下我在本系列中如何分解图形管线,这与你从APIs角度看到的景象是多么的不同。
多重管线/对管线阶段的剖析
尽管第三部分已经提及过,因为它特别重要,所以我还要再重复一次:如果你去看比如,D3D10的文档,你就会发现D3D10管线的文档。你会发现有一份D3D10管线的示意图
包含了可能涉及到的各个阶段。这个D3D10管线里会包含几何着色器,,即使你没有设置过几何着色器,同样对输出流(Stream-Out)也是如此。在纯功能型的D3D10模型中,
几何着色器阶段总是在那里的;如果你没有设置几何着色器,它就会很简单(和没意思):数据仅仅从这里以不被修改的方式传递到下面的阶段(光栅化阶段/输出流)。
这是使用API的正确方法,但是却不是我们在本系列中了解这件事的好方法。我们更关心的是硬件是如何实现这种功能模型的呢。那么,到目前为止,我们看到的这两个着色器阶段
(VS和PS)是怎样的呢?对于顶点着色器(VS), 我们了解了输入装配器(IA--Input Assembler)。IA为着色准备了顶点数据块,然后把这一批次分发到一个着色单元。
着色单元处理了一会儿之后,我们得到了返回结果并把结果写到缓冲区(供面片装配用)。确保它们按照正确的顺序进行装配,然后把它们发到下一个管线阶段(剔除/裁剪等等)。
对于像素着色器(PS),我们接受到从光栅化阶段发过来的,准备被着色的四边形,把它们批量缓存起来,直到ps着色器单元空闲下来,可以接收新的批次时,把这一批次的数据分发
到一个着色单元。同样在着色器单元处理一会儿之后,我们的到处理结果并把结果写到缓冲区(供使用),确保它们是正确的顺序,然后做混合和延迟深度剔除(late Z)然后把结果
发到内存,听起来有点熟悉,是吗?
实际上,如果我们想让着色器单元帮我们做事情,就总是这样的情况:我们先是需要一个缓冲区,然后一些分发逻辑(实际上这部分逻辑很普遍,所以可以被所有着色器类型
所共享),然后我们扩展这一行为到一束着色器上进行并行运算。最终我们需要另一个缓冲区和有排序功能的单元来处理前面的运算结果。