Realtime Rendering 3rd笔记 6

来源:互联网 发布:阿里云域名备案成功后 编辑:程序博客网 时间:2024/05/21 07:15


3.5 The Geometry Shader

geometry shader在2006年末随着DirectX10的发布被引入到硬件加速的图形流水线中,它在流水线中紧跟在vertex shader之后,并且是可选的。他是SM4.0的必须的部分,不用在早先的shader models中。
geometry shader的输入是一个物体和它的顶点。物体通常是一个mesh中的一个三角形,一个线段或仅仅是一个点。另外,扩展的顶点可以被定义并且被geometry shader处理。特别的,一个三角形外的3个附加顶点可以被传入,一个线段的两个相邻顶点也可以使用。见图3.6。
geometry shader处理这个图元并且输出零个或多个图元。输出的形式是顶点组,线段组或者三角带组。例如,不止一个三角形带可以在一次geometry shader程序调用中输出。重要的是,geometry shader可以根本不生成任何东西。通过这种方法,一个mesh可以通过geometry shader被选择性的修改:增加新的图元和删除某些图元。
geometry shader程序被设置为输入一种类型的物体并输出一种类型的物体,输入输出的类型不需要匹配。例如,可以输入三角形并输出他的图心点。甚至如果输入和输出的物体类型是一样的,每个顶点附载的数据可以被缩减或者扩展。例如,三角形的面法线可以被计算出来并且加入到输出的顶点数据中。类似于vertex shader,geometry shader必须为每个产生的顶点输出齐次裁剪空间的位置。
geometry shader保证输出图元的顺序和输入一致。这影响到性能,因为如果很多shader平行运行,结果必须被保存和排序。作为能力和效率的折中,SM4.0限制每次执行可以生成最多1024个32bit值。所以输入一个树叶生成一千个灌木叶的做法是不可行的。将简单的面棋盘式集中到更复杂的mesh也是不推荐的。这个阶段更多的是应该程序性的修改输入的数据或者做有限的拷贝,而不是大量的复制和放大。例如有一种应用是生成六个变换过的数据副本来同时渲染一个cub map的六个面(8.4.3节)。其他一些能利用geometry shader的算法有:从一个点数据创建不同尺寸的粒子组、毛皮渲染时沿着轮廓挤出鳍状物、为shadow算法找出物体边缘。

3.5.1 Stream Output
标准的GPU流水线是将数据输入到vertex shader,然后光栅化三角形并将数据传递到pixel shader。数据总是沿着流水线走,中间结果不能被访问。stream output的想法在SM4.0中被引入。当顶点被vertex shader(以及可选的geometry shader)处理后,数据除了被发送到光栅化阶段外,还可以被输出进入一个流,即一个有序数组。实际上,光栅化可以整个关闭掉,这样流水线就完全当成一个非图形的流处理器使用了。按这种方法处理的数据可以被发送回流水线,因此允许迭代处理。这种类型的操作对于模拟流水或其他粒子特效非常有用(10.7节)。

原创粉丝点击