Metal Shading Language包含许多数学函数,但是Metal official documentation中的大多数代码似乎都只是使用它来将顶点从像素空间映射到剪贴空间,例如
RasterizerData out;
out.clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0);
float2 pixelSpacePosition = vertices[vertexID].position.xy;
vector_float2 viewportSize = vector_float2(*viewportSizePointer);
out.clipSpacePosition.xy = pixelSpacePosition / (viewportSize / 2.0);
out.color = vertices[vertexID].color;
return out;
除了GPGPU使用内核函数进行并行计算外,顶点函数可以做些什么,并举一些例子?在游戏中,如果所有顶点位置都是由CPU计算的,那么GPU为什么仍然重要?顶点功能通常做什么?
答案 0 :(得分:1)
首先,我要解决这个问题
在游戏中,如果所有顶点位置都是由CPU计算的,为什么GPU仍然很重要?顶点功能通常做什么?
我不相信我见过有人计算过网格的位置,这些位置以后将用于在GPU上渲染它们。它的速度很慢,您需要将所有这些数据从CPU获取到GPU(这意味着如果您有专用的GPU,则需要通过总线将其复制)。而且它不是那么灵活。除了顶点位置以外,还有很多事情需要产生任何有意义的图像,并且在CPU上计算所有这些东西只是浪费,因为CPU在很大程度上不关心这些数据。
顶点着色器的唯一目的是为光栅化器提供位于剪辑空间中的图元。但是还有其他一些用途,这些用途大多是基于不同GPU功能的技巧。
例如,顶点着色器可以将一些数据写到缓冲区中,因此,例如,如果您不想在以后的顶点阶段再次对其进行变换,则可以流出变换后的几何图形,多次使用相同的几何图形。
您还可以使用顶点着色器仅输出一个覆盖整个屏幕的三角形,这样片段着色器就可以为整个屏幕每个像素调用一次(但是,老实说,最好使用计算(内核)着色器这个)。
您还可以从顶点着色器中写出数据,而不生成任何图元。您可以通过生成退化三角形来实现。您可以使用它来生成边界框。使用原子操作,您可以更新最小/最大位置并在以后读取它们。这对于光剔除,平截头剔除,基于图块的处理以及许多其他操作很有用。
但是,它是一个 BIG BUT ,您可以在计算着色器中完成大多数操作,而无需使GPU来运行所有顶点装配管线。这意味着,您可以仅使用计算着色器(而不是顶点和片段着色器以及介于两者之间的许多管线阶段,例如光栅化器,原始剔除,深度测试和输出合并)来进行全屏效果。您可以计算边界框,并在计算着色器中进行光剔除或平截头体剔除。
例如,如果您仍将使用从顶点着色器输出的三角形,或者不确定如何在其中放置基元,则有理由启动整个渲染管道,而不仅仅是运行计算着色器内存,因此您需要顶点汇编程序来完成汇编图元的繁重工作。但是,回到您的观点,顶点着色器的几乎所有合理用途都包括在剪辑空间中输出图元。如果您不使用生成的原语,最好 坚持使用计算着色器。
答案 1 :(得分:1)
顶点着色器计算顶点的属性。这就是他们的重点。除了顶点位置之外,它们还计算每个顶点处的光照法线。以及潜在的纹理坐标。以及照明和着色例程使用的各种材料属性。然后,在片段处理阶段,对这些值进行插值并发送给每个片段的片段着色器。
通常,您不修改CPU上的顶点。在游戏中,通常需要将它们从文件加载到主存储器中,然后将其放入缓冲区中,然后将其发送到GPU。将它们放置在GPU上后,将它们连同模型,视图和投影矩阵一起传递到每一帧的顶点着色器。一个包含例如树木或车轮的顶点的缓冲区可能会被多次使用。每次CPU发送的都是模型,视图和投影矩阵。顶点着色器中使用模型矩阵来重新定位和缩放顶点在世界空间中的位置。然后,视图矩阵移动并旋转周围的世界,以便虚拟相机位于原点并面向适当的方向。然后,投影矩阵会修改顶点以将其放入剪辑空间。
顶点着色器还可以做其他事情。例如,您可以传递x-y平面中的网格中的顶点。然后,您可以在顶点着色器中对纹理进行采样,然后使用该纹理生成z值。这为您提供了一种使用高度图更改几何形状的方法。
在较旧的硬件(和某些低端移动硬件)上,在使用纹理坐标从纹理采样之前对纹理坐标进行计算非常昂贵,因为这样会丢失一些缓存一致性。例如,如果要对一列中的几个像素进行采样,则可以在它们上循环,为当前纹理坐标添加偏移量,然后对结果进行采样。一种技巧是在顶点着色器中对纹理坐标进行计算,并在将其自动插入之前将其插入片段着色器,然后在片段着色器中进行常规查找。 (我不认为这是对现代硬件的优化,但是在某些较旧的型号上这是一个巨大的胜利。)