赞
踩
赶在 2019 结束之前把第三章结束,提前祝大家新年快乐!
几何着色器可以将图元转换为其他图元,而这在细分阶段是无法完成的。例如,可以通过让每个三角形创建线边缘,将三角形网格转换为线框视图。或者,可以将这些线替换为面向观察者的四边形,从而使线框渲染的边缘更粗 [1492]。几何着色器是在2006年底随 DirectX 10 发行版添加到硬件加速的图形管道中的。它位于管道中的细分着色器之后,并且可以选择使用。虽然是 Shader Model 4.0 的必需部分,但在较早的着色器模型中未使用它。OpenGL 3.2和OpenGL ES 3.2也支持这种类型的着色器。
几何着色器的输入是单个对象及其关联的顶点。对象通常由带状(strip),线段(line segment)或点(point)构成的三角形所组成。扩展的图元可以由几何着色器定义和处理。特别是,可以传入三角形外部的三个附加顶点,并且可以使用折线上的两个相邻顶点。参见图3.12。使用 DirectX 11 和 Shader Model 5.0,你可以传入多达32个控制点的更精细的补丁程序。也就是说,细分阶段对于补丁生成更有效 [175]。
几何着色器处理该图元并输出零个或多个顶点,这些顶点被视为点(points),折线(polylines)或三角形带(triangles)。请注意,几何着色器根本无法生成任何输出。通过这种方式,可以通过编辑顶点,添加新图元以及删除其他图元来选择性地修改网格。
几何着色器设计用于修改传入的数据或制作有限数量的副本(copies)。例如,一种用途是生成六个转换后的数据副本,以同时渲染立方体贴图的六个面; 参见第10.4.3节。它也可以用来有效地创建级联的阴影贴图(cascaded shadow maps),以生成高质量的阴影。利用几何着色器的其他算法包括从点数据创建尺寸可变的粒子,沿着轮廓拉伸鳍(fins)以进行毛发渲染以及为着色算法找到对象边缘。有关更多示例,请参见图3.13。这些和其他用途将在本书的其余部分中讨论。
图3.13。几何着色器(GS)的某些用途。左侧图,使用GS快速进行元球等值面细分。中间图,使用GS完成线段的分形细分并将其输出,而GS生成广告牌以显示闪电效果。右侧图,通过使用流输出的顶点和几何着色器执行布料模拟。(图片来自NVIDIA SDK 10 [1300]示例,由NVIDIA Corporation提供。)
DirectX 11增加了几何着色器使用实例化的功能,其中几何着色器可以在任何给定的图元上运行设定的次数 [530,1971]。在OpenGL 4.0中,这是通过调用计数指定的。几何着色器最多也可以输出四个流。可以在渲染管道上发送一个流以进行进一步处理。所有这些流都可以选择发送到流输出渲染目标。
保证几何着色器以与输入相同的顺序从图元输出结果。这会影响性能,因为如果多个着色器内核并行运行,则必须保存和排序结果。此因素和其他因素不利于在单个调用中用于复制或创建大量几何图形的几何着色器 [175,530]。
发出绘制调用后,管线中只有三个位置可以在GPU上创建工作:光栅化,细分阶段和几何体着色器。其中,考虑到所需的资源和内存,几何着色器的行为是最不可预测的,因为它是完全可编程的。实际上,几何着色器通常用得很少,因为它无法很好地映射到GPU的优势。在某些移动设备上,它是通过软件实现的,因此在此强烈建议不要使用它 [69]。
引用:
[530] Giesen, Fabian, “A Trip through the Graphics Pipeline 2011,” The ryg blog, July 9, 2011. Cited on p. 32, 42, 46, 47, 48, 49, 52, 53, 54, 55, 141, 247, 684, 701, 784, 1040
[1971] Zink, Jason, Matt Pettineo, and Jack Hoxley, Practical Rendering & Computation with Direct3D 11, CRC Press, 2011. Cited on p. 47, 54, 90, 518, 519, 520, 568, 795, 813, 814, 914
[175] Blythe, David, “The Direct3D 10 System,” ACM Transactions on Graphics, vol. 25, no. 3, pp. 724–734, July 2006. Cited on p. 29, 39, 42, 47, 48, 50, 249
[530] Giesen, Fabian, “A Trip through the Graphics Pipeline 2011,” The ryg blog, July 9, 2011. Cited on p. 32, 42, 46, 47, 48, 49, 52, 53, 54, 55, 141, 247, 684, 701, 784, 1040
[69] ARM Limited, “ARM R MaliTMApplication Developer Best Practices, Version 1.0,” ARM documentation, Feb. 27, 2017. Cited on p. 48, 798, 1029
GPU管线的标准使用方法是通过顶点着色器发送数据,然后光栅化生成三角形并在像素着色器中进行处理。在以前,数据总是通过管线传递,而中间结果无法访问。流输出(stream output)的想法是在 Shader Model 4.0 中引入的。在顶点着色器(以及可选的细分和几何着色器)处理了顶点之后,除了可以发送到光栅化阶段之外,还可以将它们输出到流(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。