Realtime Rendering 3rd笔记 7

3.6 The Pixel Shader

在vs和gs执行之后,图元被clipped并set up准备光栅化,这个阶段是很固定的,不能编程(值得注意的例外是pixel shader可以指定使用哪种插值,perspective corrected or screen space, or none)。每个三角形依次处理,顶点数据在三角形内插值。pixel shader是下一个可编程阶段。在OpenGL中,被称作fragmenet shader,这在某种角度是一个更好的名字。这个意思是说,一个三角形全部或部分的覆盖每个像素,并且材质描绘为不透明的或透明的。光栅器不直接修改像素的颜色,而是生产数据,描述三角形如何覆盖像素。之后在merging阶段,片段的数据被使用来修改像素。
vs的输出成为ps的输入,SM4.0中一共有16个vector可以从vs传输到ps,如果使用gs,可以输出32个vector到ps。SM3.0之后,给ps的额外的输入被加入,例如三角形的哪个面是可见的作为一个输入标志。片段的屏幕坐标对于ps也是可用的。
ps的限制是他只能影响他所处理的片段,不能将结果直接传递给相邻的像素,而是使用顶点插值的数据和存储的常量以及纹理数据。然而,这个限制也不是太严重,因为可以使用image processing来影响相邻的像素(10.9)。
一种情况下ps可以访问临近像素的信息(虽然是间接的),即计算梯度(gradient)或者derivative information。The pixel shader has the ability to take any value and compute the amount by which it changes per pixel along the x and y screen axes.这对于多种计算和纹理寻址很有用。梯度信息不能被动态控制流影响的shader访问。
ps一般是设置片段的颜色,颜色在最终的merging阶段被合并。光栅化阶段产生的深度值也可以被ps修改。stencil buffer的值是不可以修改的,会直接发送到merge阶段。从SM2.0开始,ps可以丢弃(discard)输入的片段数据,即不产生输出。这种操作是消耗性能的,因为GPU将不能进行优化。在SM4.0中,fog计算和alpha test从merge阶段被移动到ps中。(es2.0也一样)
ps可以进行的处理,这种在单一pass中计算任意数目值的能力促进了multiple render targets(MRT)的使用。每个片段可以生成多个向量并被保存到不同的多个buffer中,这些buffer必须是相同尺寸的,并且一些架构需要他们具有相同的bit depth(尽管如果需要格式可以不同)。PS输出寄存器的数量参考独立的buffer的数量,例如4或8。不同于color buffer,附加的target有一些限制。例如,不能使用反锯齿。尽管有这些限制,MRT功能对于更有效的执行渲染算法是一个强大的辅助。如果有很多中间结果的image需要从一批相同的数据中计算出来,只需要一个rendering pass就可以了,而不是每个pass对应一个输出buffer。另外的一个MRT相关的关键能力是从产生的image读取回数据作为纹理使用。

3.7 The Merging Stage

merge阶段独立片段的深度值和颜色和frame buffer进行组合。stencil-buffer,Z-buffer操作在这阶段进行。另外一个操作是color blending。merge阶段是不可编程的,但也不完全固定,他可以通过配置来定制操作。特别是color blending,可以使用很多不同的操作,例如乘法,加法,减法,使用颜色和alpha值;其他的操作如取最小值和取最大值也是可能的,以及还有位逻辑操作。DirectX10增加了从pixel shader输出两个颜色和frame buffer上的颜色进行混合的功能,被称作dual-color blending。
如果采用了MRT功能,blending可以在多个buffer上进行。DirectX10.1引入了一个功能:在每个MRT buffer上进行不同的混合操作,在之前的版本中,所有的buffer只能进行相同的混合操作。(注意dual-color blending和MRT不兼容)

你可能感兴趣的:(编程,算法,UP)